]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
- Pascal Terjan filed bug #2154627
authorDaniel Stenberg <daniel@haxx.se>
Wed, 15 Oct 2008 21:43:48 +0000 (21:43 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 15 Oct 2008 21:43:48 +0000 (21:43 +0000)
  (http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl
  uses strcasecmp() in multiple places where it causes failures when the
  Turkish locale is used. This is because 'i' and 'I' isn't the same letter so
  strcasecmp() on those letters are different in Turkish than in English (or
  just about all other languages). I thus introduced a totally new internal
  function in libcurl (called Curl_ascii_equal) for doing case insentive
  comparisons for english-(ascii?) style strings that thus will make "file"
  and "FILE" match even if the Turkish locale is selected.

18 files changed:
CHANGES
RELEASE-NOTES
TODO-RELEASE
lib/cookie.c
lib/curlx.h
lib/gtls.c
lib/http.c
lib/http_digest.c
lib/ldap.c
lib/netrc.c
lib/nss.c
lib/parsedate.c
lib/ssluse.c
lib/strequal.c
lib/strequal.h
lib/telnet.c
lib/url.c
src/main.c

diff --git a/CHANGES b/CHANGES
index fb5a37518f61b14baaaa70dd17119fb4c568bd98..6d6515b8f2b666e458925249b323a605c1229359 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,17 @@
 
                                   Changelog
 
+Daniel Stenberg (15 Oct 2008)
+- Pascal Terjan filed bug #2154627
+  (http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl
+  uses strcasecmp() in multiple places where it causes failures when the
+  Turkish locale is used. This is because 'i' and 'I' isn't the same letter so
+  strcasecmp() on those letters are different in Turkish than in English (or
+  just about all other languages). I thus introduced a totally new internal
+  function in libcurl (called Curl_ascii_equal) for doing case insentive
+  comparisons for english-(ascii?) style strings that thus will make "file"
+  and "FILE" match even if the Turkish locale is selected.
+
 Daniel Fandrich (15 Oct 2008)
 - A <precheck> command is considered to have failed if it returns a non-zero
   return code.  This way, if the precheck command can't be run at all for
index 23083284d66e93575f43c53efa090426f99e4461..cba3eed219641697d5c1910ee597cc209a565f3a 100644 (file)
@@ -37,6 +37,7 @@ This release includes the following bugfixes:
  o CURLINFO_PRIMARY_IP fixed for persistent connection re-use cases
  o remove_handle/add_handle multi interface timer callback flaw
  o CURLINFO_REDIRECT_URL memory leak and wrong-doing
+ o case insensitive matching works in Turkish too
 
 This release includes the following known bugs:
 
@@ -53,6 +54,6 @@ advice from friends like these:
  Linus Nielsen Feltzing, Martin Drasar, Stefan Krause, Dmitry Kurochkin,
  Mike Revi, Andres Garcia, Michael Goffioul, Markus Moeller, Rob Crittenden,
  Jamie Lokier, Emanuele Bovisio, Maxim Ivanov, Ian Lynagh, Daniel Egger,
- Igor Novoseltsev, John Wilkinson
+ Igor Novoseltsev, John Wilkinson, Pascal Terjan
 
         Thanks! (and sorry if I forgot to mention someone)
index 36acf6cd047081c2d2e358e897a5ea4afba93cdd..1d00a2a09619554695c649878a77ae89eef391d8 100644 (file)
@@ -25,7 +25,5 @@ Patches pending commit:
 
 185 - CURLOPT_PROXYUSER etc
 
-186 - strcasecmp in Turkish
-
 188 -
 
index 982bed063af3eeb537e76ba82983491ce0eb9bed..2886c18a2034f1aee378e7de9801e2a9591b7d32 100644 (file)
@@ -243,14 +243,14 @@ Curl_cookie_add(struct SessionHandle *data,
             whatptr++;
           }
 
-          if(strequal("path", name)) {
+          if(Curl_ascii_equal("path", name)) {
             co->path=strdup(whatptr);
             if(!co->path) {
               badcookie = TRUE; /* out of memory bad */
               break;
             }
           }
-          else if(strequal("domain", name)) {
+          else if(Curl_ascii_equal("domain", name)) {
             /* note that this name may or may not have a preceeding dot, but
                we don't care about that, we treat the names the same anyway */
 
@@ -315,14 +315,14 @@ Curl_cookie_add(struct SessionHandle *data,
               }
             }
           }
-          else if(strequal("version", name)) {
+          else if(Curl_ascii_equal("version", name)) {
             co->version=strdup(whatptr);
             if(!co->version) {
               badcookie = TRUE;
               break;
             }
           }
-          else if(strequal("max-age", name)) {
+          else if(Curl_ascii_equal("max-age", name)) {
             /* Defined in RFC2109:
 
                Optional.  The Max-Age attribute defines the lifetime of the
@@ -341,7 +341,7 @@ Curl_cookie_add(struct SessionHandle *data,
               atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]) +
               (long)now;
           }
-          else if(strequal("expires", name)) {
+          else if(Curl_ascii_equal("expires", name)) {
             co->expirestr=strdup(whatptr);
             if(!co->expirestr) {
               badcookie = TRUE;
@@ -371,10 +371,10 @@ Curl_cookie_add(struct SessionHandle *data,
       else {
         if(sscanf(ptr, "%" MAX_COOKIE_LINE_TXT "[^;\r\n]",
                   what)) {
-          if(strequal("secure", what)) {
+          if(Curl_ascii_equal("secure", what)) {
             co->secure = TRUE;
           }
-          else if (strequal("httponly", what)) {
+          else if (Curl_ascii_equal("httponly", what)) {
             co->httponly = TRUE;
           }
           /* else,
@@ -498,7 +498,7 @@ Curl_cookie_add(struct SessionHandle *data,
            As far as I can see, it is set to true when the cookie says
            .domain.com and to false when the domain is complete www.domain.com
         */
-        co->tailmatch=(bool)strequal(ptr, "TRUE"); /* store information */
+        co->tailmatch=(bool)Curl_ascii_equal(ptr, "TRUE"); /* store information */
         break;
       case 2:
         /* It turns out, that sometimes the file format allows the path
@@ -518,7 +518,7 @@ Curl_cookie_add(struct SessionHandle *data,
         fields++; /* add a field and fall down to secure */
         /* FALLTHROUGH */
       case 3:
-        co->secure = (bool)strequal(ptr, "TRUE");
+        co->secure = (bool)Curl_ascii_equal(ptr, "TRUE");
         break;
       case 4:
         co->expires = curlx_strtoofft(ptr, NULL, 10);
@@ -571,11 +571,11 @@ Curl_cookie_add(struct SessionHandle *data,
   clist = c->cookies;
   replace_old = FALSE;
   while(clist) {
-    if(strequal(clist->name, co->name)) {
+    if(Curl_ascii_equal(clist->name, co->name)) {
       /* the names are identical */
 
       if(clist->domain && co->domain) {
-        if(strequal(clist->domain, co->domain))
+        if(Curl_ascii_equal(clist->domain, co->domain))
           /* The domains are identical */
           replace_old=TRUE;
       }
@@ -586,7 +586,7 @@ Curl_cookie_add(struct SessionHandle *data,
         /* the domains were identical */
 
         if(clist->path && co->path) {
-          if(strequal(clist->path, co->path)) {
+          if(Curl_ascii_equal(clist->path, co->path)) {
             replace_old = TRUE;
           }
           else
@@ -778,7 +778,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
       /* now check if the domain is correct */
       if(!co->domain ||
          (co->tailmatch && tailmatch(co->domain, host)) ||
-         (!co->tailmatch && strequal(host, co->domain)) ) {
+         (!co->tailmatch && Curl_ascii_equal(host, co->domain)) ) {
         /* the right part of the host matches the domain stuff in the
            cookie data */
 
index 26948d3052499e6610efacd4e736565a543cada5..94f277f10afc116b64996e4e8923ecd0aeea16c0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -65,6 +65,7 @@
 #define curlx_getenv curl_getenv
 #define curlx_strequal curl_strequal
 #define curlx_strnequal curl_strnequal
+#define curlx_ascii_equal Curl_ascii_equal
 #define curlx_mvsnprintf curl_mvsnprintf
 #define curlx_msnprintf curl_msnprintf
 #define curlx_maprintf curl_maprintf
index 89a8079bfee8397ae2872fa05e9c8b2399d9909f..17e3947c96219d4332c57f81ceda0934ed9f42f5 100644 (file)
@@ -223,9 +223,9 @@ static gnutls_x509_crt_fmt do_file_type(const char *type)
 {
   if(!type || !type[0])
     return GNUTLS_X509_FMT_PEM;
-  if(curl_strequal(type, "PEM"))
+  if(Curl_ascii_equal(type, "PEM"))
     return GNUTLS_X509_FMT_PEM;
-  if(curl_strequal(type, "DER"))
+  if(Curl_ascii_equal(type, "DER"))
     return GNUTLS_X509_FMT_DER;
   return -1;
 }
index 9535c7633d7a2c205e56d891a692455b919e0ce6..da7972459f88771df38ff48a495409898466ae30 100644 (file)
@@ -613,7 +613,7 @@ http_output_auth(struct connectdata *conn,
   if(!data->state.this_is_a_follow ||
      conn->bits.netrc ||
      !data->state.first_host ||
-     curl_strequal(data->state.first_host, conn->host.name) ||
+     Curl_ascii_equal(data->state.first_host, conn->host.name) ||
      data->set.http_disable_hostname_check_before_authentication) {
 
     /* Send web authentication header if needed */
@@ -2185,7 +2185,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
 
   ptr = checkheaders(data, "Host:");
   if(ptr && (!data->state.this_is_a_follow ||
-             curl_strequal(data->state.first_host, conn->host.name))) {
+             Curl_ascii_equal(data->state.first_host, conn->host.name))) {
 #if !defined(CURL_DISABLE_COOKIES)
     /* If we have a given custom Host: header, we extract the host name in
        order to possibly use it for cookie reasons later on. We only allow the
index 0d92652a069d57983ed06705a6526f4ddaabf645..2e774f3d4dbd2b39b8ffbd1592c652fe79cd3689 100644 (file)
@@ -110,28 +110,28 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
            */
           content[0]=0;
         }
-        if(strequal(value, "nonce")) {
+        if(Curl_ascii_equal(value, "nonce")) {
           d->nonce = strdup(content);
           if(!d->nonce)
             return CURLDIGEST_NOMEM;
         }
-        else if(strequal(value, "stale")) {
-          if(strequal(content, "true")) {
+        else if(Curl_ascii_equal(value, "stale")) {
+          if(Curl_ascii_equal(content, "true")) {
             d->stale = TRUE;
             d->nc = 1; /* we make a new nonce now */
           }
         }
-        else if(strequal(value, "realm")) {
+        else if(Curl_ascii_equal(value, "realm")) {
           d->realm = strdup(content);
           if(!d->realm)
             return CURLDIGEST_NOMEM;
         }
-        else if(strequal(value, "opaque")) {
+        else if(Curl_ascii_equal(value, "opaque")) {
           d->opaque = strdup(content);
           if(!d->opaque)
             return CURLDIGEST_NOMEM;
         }
-        else if(strequal(value, "qop")) {
+        else if(Curl_ascii_equal(value, "qop")) {
           char *tok_buf;
           /* tokenize the list and choose auth if possible, use a temporary
              clone of the buffer since strtok_r() ruins it */
@@ -140,10 +140,10 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
             return CURLDIGEST_NOMEM;
           token = strtok_r(tmp, ",", &tok_buf);
           while(token != NULL) {
-            if(strequal(token, "auth")) {
+            if(Curl_ascii_equal(token, "auth")) {
               foundAuth = TRUE;
             }
-            else if(strequal(token, "auth-int")) {
+            else if(Curl_ascii_equal(token, "auth-int")) {
               foundAuthInt = TRUE;
             }
             token = strtok_r(NULL, ",", &tok_buf);
@@ -161,13 +161,13 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
               return CURLDIGEST_NOMEM;
           }
         }
-        else if(strequal(value, "algorithm")) {
+        else if(Curl_ascii_equal(value, "algorithm")) {
           d->algorithm = strdup(content);
           if(!d->algorithm)
             return CURLDIGEST_NOMEM;
-          if(strequal(content, "MD5-sess"))
+          if(Curl_ascii_equal(content, "MD5-sess"))
             d->algo = CURLDIGESTALGO_MD5SESS;
-          else if(strequal(content, "MD5"))
+          else if(Curl_ascii_equal(content, "MD5"))
             d->algo = CURLDIGESTALGO_MD5;
           else
             return CURLDIGEST_BADALGO;
@@ -362,7 +362,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
     return CURLE_OUT_OF_MEMORY;
   }
 
-  if(d->qop && strequal(d->qop, "auth-int")) {
+  if(d->qop && Curl_ascii_equal(d->qop, "auth-int")) {
     /* We don't support auth-int at the moment. I can't see a easy way to get
        entity-body here */
     /* TODO: Append H(entity-body)*/
@@ -423,7 +423,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
                d->qop,
                request_digest);
 
-    if(strequal(d->qop, "auth"))
+    if(Curl_ascii_equal(d->qop, "auth"))
       d->nc++; /* The nc (from RFC) has to be a 8 hex digit number 0 padded
                   which tells to the server how many times you are using the
                   same nonce in the qop=auth mode. */
index 816b46faf73dcba64fd9916aa283e17acf412fd1..917269171f247649a44a09e168bfa2f1bf703382 100644 (file)
@@ -198,7 +198,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
   }
 
   /* Get the URL scheme ( either ldap or ldaps ) */
-  if(strequal(conn->protostr, "LDAPS"))
+  if(Curl_ascii_equal(conn->protostr, "LDAPS"))
     ldap_ssl = 1;
   infof(data, "LDAP local: trying to establish %s connection\n",
           ldap_ssl ? "encrypted" : "cleartext");
@@ -228,7 +228,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
       /* Novell SDK supports DER or BASE64 files. */
       int cert_type = LDAPSSL_CERT_FILETYPE_B64;
       if((data->set.str[STRING_CERT_TYPE]) &&
-              (strequal(data->set.str[STRING_CERT_TYPE], "DER")))
+         (Curl_ascii_equal(data->set.str[STRING_CERT_TYPE], "DER")))
         cert_type = LDAPSSL_CERT_FILETYPE_DER;
       if(!ldap_ca) {
         failf(data, "LDAP local: ERROR %s CA cert not set!",
@@ -269,7 +269,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
     if(data->set.ssl.verifypeer) {
       /* OpenLDAP SDK supports BASE64 files. */
       if((data->set.str[STRING_CERT_TYPE]) &&
-              (!strequal(data->set.str[STRING_CERT_TYPE], "PEM"))) {
+         (!Curl_ascii_equal(data->set.str[STRING_CERT_TYPE], "PEM"))) {
         failf(data, "LDAP local: ERROR OpenLDAP does only support PEM cert-type!");
         status = CURLE_SSL_CERTPROBLEM;
         goto quit;
index d7c7fd10843d4b16725cf33e072817aa268ab611..2f049e9295bbd2bce6d4a49329e62ffa0ba42ff1 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -155,7 +155,7 @@ int Curl_parsenetrc(const char *host,
 
         switch(state) {
         case NOTHING:
-          if(strequal("machine", tok)) {
+          if(Curl_ascii_equal("machine", tok)) {
             /* the next tok is the machine name, this is in itself the
                delimiter that starts the stuff entered for this machine,
                after this we need to search for 'login' and
@@ -164,7 +164,7 @@ int Curl_parsenetrc(const char *host,
           }
           break;
         case HOSTFOUND:
-          if(strequal(host, tok)) {
+          if(Curl_ascii_equal(host, tok)) {
             /* and yes, this is our host! */
             state=HOSTVALID;
 #ifdef _NETRC_DEBUG
@@ -180,7 +180,7 @@ int Curl_parsenetrc(const char *host,
           /* we are now parsing sub-keywords concerning "our" host */
           if(state_login) {
             if(specific_login) {
-              state_our_login = strequal(login, tok);
+              state_our_login = Curl_ascii_equal(login, tok);
             }
             else {
               strncpy(login, tok, LOGINSIZE-1);
@@ -199,11 +199,11 @@ int Curl_parsenetrc(const char *host,
             }
             state_password=0;
           }
-          else if(strequal("login", tok))
+          else if(Curl_ascii_equal("login", tok))
             state_login=1;
-          else if(strequal("password", tok))
+          else if(Curl_ascii_equal("password", tok))
             state_password=1;
-          else if(strequal("machine", tok)) {
+          else if(Curl_ascii_equal("machine", tok)) {
             /* ok, there's machine here go => */
             state = HOSTFOUND;
             state_our_login = FALSE;
index a868fc3827fbed49596687bc6342d8b2f357e372..409b0462d67f86959cd9911726d2174c1b7a502c 100644 (file)
--- a/lib/nss.c
+++ b/lib/nss.c
@@ -43,7 +43,6 @@
 #include "strequal.h"
 #include "select.h"
 #include "sslgen.h"
-#include "strequal.h" 
 
 #define _MPRINTF_REPLACE /* use the internal *printf() functions */
 #include <curl/mprintf.h>
@@ -202,7 +201,7 @@ static SECStatus set_ciphers(struct SessionHandle *data, PRFileDesc * model,
     found = PR_FALSE;
 
     for(i=0; i<NUM_OF_CIPHERS; i++) {
-      if(strequal(cipher, cipherlist[i].name)) {
+      if(Curl_ascii_equal(cipher, cipherlist[i].name)) {
         cipher_state[i] = PR_TRUE;
         found = PR_TRUE;
         break;
index fc6f9216fe448eb02c2fd5892fcde6ac84a1e2f1..11dc55e64b2ce8df324edcc8bcd128b0e8d6f47d 100644 (file)
@@ -83,6 +83,7 @@
 #endif
 
 #include <curl/curl.h>
+#include "strequal.h"
 #include "parsedate.h"
 
 const char * const Curl_wkday[] =
@@ -163,7 +164,7 @@ static int checkday(const char *check, size_t len)
   else
     what = &Curl_wkday[0];
   for(i=0; i<7; i++) {
-    if(curl_strequal(check, what[0])) {
+    if(Curl_ascii_equal(check, what[0])) {
       found=TRUE;
       break;
     }
@@ -180,7 +181,7 @@ static int checkmonth(const char *check)
 
   what = &Curl_month[0];
   for(i=0; i<12; i++) {
-    if(curl_strequal(check, what[0])) {
+    if(Curl_ascii_equal(check, what[0])) {
       found=TRUE;
       break;
     }
@@ -200,7 +201,7 @@ static int checktz(const char *check)
 
   what = tz;
   for(i=0; i< sizeof(tz)/sizeof(tz[0]); i++) {
-    if(curl_strequal(check, what->name)) {
+    if(Curl_ascii_equal(check, what->name)) {
       found=TRUE;
       break;
     }
index d0f5501fefbdc8888747b8dc404ed0fd57bb1734..1c47508efe40dbe9b43dc94555a8229c226ccf04 100644 (file)
@@ -284,13 +284,13 @@ static int do_file_type(const char *type)
 {
   if(!type || !type[0])
     return SSL_FILETYPE_PEM;
-  if(curl_strequal(type, "PEM"))
+  if(Curl_ascii_equal(type, "PEM"))
     return SSL_FILETYPE_PEM;
-  if(curl_strequal(type, "DER"))
+  if(Curl_ascii_equal(type, "DER"))
     return SSL_FILETYPE_ASN1;
-  if(curl_strequal(type, "ENG"))
+  if(Curl_ascii_equal(type, "ENG"))
     return SSL_FILETYPE_ENGINE;
-  if(curl_strequal(type, "P12"))
+  if(Curl_ascii_equal(type, "P12"))
     return SSL_FILETYPE_PKCS12;
   return -1;
 }
@@ -1010,7 +1010,7 @@ cert_hostcheck(const char *match_pattern, const char *hostname)
       !hostname || !*hostname) /* sanity check */
     return 0;
 
-  if(curl_strequal(hostname,match_pattern)) /* trivial case */
+  if(Curl_ascii_equal(hostname, match_pattern)) /* trivial case */
     return 1;
 
   if(hostmatch(hostname,match_pattern) == HOST_MATCH)
index e8c6674970b1e648f1a2e5bc18f6d2ee8984005a..c1a82f789395d70baa87763b453cd2cdf9fe4541 100644 (file)
@@ -76,6 +76,30 @@ int curl_strnequal(const char *first, const char *second, size_t max)
 #endif
 }
 
+/*
+ * Curl_ascii_equal() is for doing "ascii" case insensitive strings. This is
+ * meant to be locale independent and only compare strings we know are safe
+ * for this.
+ * See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for some
+ * further explanation to why this function is necessary.
+ */
+#define TOASCIIUPPER(x) ((((x) >= 'a') && ((x) <= 'z'))?((x) - 0x20):(x))
+
+int Curl_ascii_equal(const char *first, const char *second)
+{
+  while(*first && *second) {
+    if(! (TOASCIIUPPER(*first) == TOASCIIUPPER(*second)))
+      /* get out of the loop as soon as they don't match */
+      break;
+    first++;
+    second++;
+  }
+  /* we do the comparison here (possibly again), just to make sure that if the
+     loop above is skipped because one of the strings reached zero, we must not
+     return this as a successful match */
+  return (TOASCIIUPPER(*first) == TOASCIIUPPER(*second));
+}
+
 #ifndef HAVE_STRLCAT
 /*
  * The strlcat() function appends the NUL-terminated string src to the end
index 70066559f5dbb53f3113c20880035ad5bb115c7d..d1bc86ef598011913b57ac81d6625de52ca43fea 100644 (file)
    argument is zero-byte terminated */
 #define checkprefix(a,b)    strnequal(a,b,strlen(a))
 
+/*
+ * Curl_ascii_equal() is for doing "ascii" case insensitive strings. This is
+ * meant to be locale independent and only compare strings we know are safe
+ * for this.
+ */
+int Curl_ascii_equal(const char *first, const char *second);
 
 #ifndef HAVE_STRLCAT
 #define strlcat(x,y,z) Curl_strlcat(x,y,z)
index 77f51b523c6e70230febd7d302b4252125847a53..3b5e1d761826b894f7fc418036376dca788b3d14 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -833,7 +833,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
               option_keyword, option_arg) == 2) {
 
       /* Terminal type */
-      if(curl_strequal(option_keyword, "TTYPE")) {
+      if(Curl_ascii_equal(option_keyword, "TTYPE")) {
         strncpy(tn->subopt_ttype, option_arg, 31);
         tn->subopt_ttype[31] = 0; /* String termination */
         tn->us_preferred[CURL_TELOPT_TTYPE] = CURL_YES;
@@ -841,7 +841,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
       }
 
       /* Display variable */
-      if(curl_strequal(option_keyword, "XDISPLOC")) {
+      if(Curl_ascii_equal(option_keyword, "XDISPLOC")) {
         strncpy(tn->subopt_xdisploc, option_arg, 127);
         tn->subopt_xdisploc[127] = 0; /* String termination */
         tn->us_preferred[CURL_TELOPT_XDISPLOC] = CURL_YES;
@@ -849,7 +849,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
       }
 
       /* Environment variable */
-      if(curl_strequal(option_keyword, "NEW_ENV")) {
+      if(Curl_ascii_equal(option_keyword, "NEW_ENV")) {
         buf = strdup(option_arg);
         if(!buf)
           return CURLE_OUT_OF_MEMORY;
index d1393d2e6871bc895e00b7b08f7d740cc47f505d..448133c6d34ebd9ef65bbf731d1e884b4835348c 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1216,17 +1216,17 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
     if(argptr == NULL)
       break;
 
-    if(strequal(argptr, "ALL")) {
+    if(Curl_ascii_equal(argptr, "ALL")) {
       /* clear all cookies */
       Curl_cookie_clearall(data->cookies);
       break;
     }
-    else if(strequal(argptr, "SESS")) {
+    else if(Curl_ascii_equal(argptr, "SESS")) {
       /* clear session cookies */
       Curl_cookie_clearsess(data->cookies);
       break;
     }
-    else if(strequal(argptr, "FLUSH")) {
+    else if(Curl_ascii_equal(argptr, "FLUSH")) {
       /* flush cookies to file */
       flush_cookies(data, 0);
       break;
@@ -2496,14 +2496,14 @@ ConnectionExists(struct SessionHandle *data,
     if(!needle->bits.httpproxy || needle->protocol&PROT_SSL ||
        (needle->bits.httpproxy && check->bits.httpproxy &&
         needle->bits.tunnel_proxy && check->bits.tunnel_proxy &&
-        strequal(needle->proxy.name, check->proxy.name) &&
+        Curl_ascii_equal(needle->proxy.name, check->proxy.name) &&
         (needle->port == check->port))) {
       /* The requested connection does not use a HTTP proxy or it uses SSL or
          it is a non-SSL protocol tunneled over the same http proxy name and
          port number */
 
-      if(strequal(needle->protostr, check->protostr) &&
-         strequal(needle->host.name, check->host.name) &&
+      if(Curl_ascii_equal(needle->protostr, check->protostr) &&
+         Curl_ascii_equal(needle->host.name, check->host.name) &&
          (needle->remote_port == check->remote_port) ) {
         if(needle->protocol & PROT_SSL) {
           /* This is SSL, verify that we're using the same
@@ -2542,7 +2542,7 @@ ConnectionExists(struct SessionHandle *data,
               is the checked one using the same host, port and type? */
       if(check->bits.proxy &&
          (needle->proxytype == check->proxytype) &&
-         strequal(needle->proxy.name, check->proxy.name) &&
+         Curl_ascii_equal(needle->proxy.name, check->proxy.name) &&
          needle->port == check->port) {
         /* This is the same proxy connection, use it! */
         match = TRUE;
@@ -3021,7 +3021,7 @@ static CURLcode ParseURLAndFillConnection(struct SessionHandle *data,
    ************************************************************/
   if((2 == sscanf(data->change.url, "%15[^:]:%[^\n]",
                   conn->protostr,
-                  path)) && strequal(conn->protostr, "file")) {
+                  path)) && Curl_ascii_equal(conn->protostr, "file")) {
     if(path[0] == '/' && path[1] == '/') {
       /* Allow omitted hostname (e.g. file:/<path>).  This is not strictly
        * speaking a valid file: URL by RFC 1738, but treating file:/<path> as
@@ -3256,7 +3256,7 @@ static CURLcode setup_connection_internals(struct SessionHandle *data,
   /* Scan protocol handler table. */
 
   for (pp = protocols; (p = *pp) != NULL; pp++)
-    if(strequal(p->scheme, conn->protostr)) {
+    if(Curl_ascii_equal(p->scheme, conn->protostr)) {
       /* Protocol found in table. Perform setup complement if some. */
       conn->handler = p;
 
@@ -3370,7 +3370,7 @@ static char *detect_proxy(struct connectdata *conn)
        * This can cause 'internal' http/ftp requests to be
        * arbitrarily redirected by any external attacker.
        */
-      if(!prox && !strequal("http_proxy", proxy_env)) {
+      if(!prox && !Curl_ascii_equal("http_proxy", proxy_env)) {
         /* There was no lowercase variable, try the uppercase version: */
         for(envp = proxy_env; *envp; envp++)
           *envp = (char)toupper((int)*envp);
@@ -3691,8 +3691,8 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
     if(conn->bits.httpproxy) {
       /* we need to create new URL with the new port number */
       char *url;
-      bool isftp = (bool)(strequal("ftp", conn->protostr) ||
-                          strequal("ftps", conn->protostr));
+      bool isftp = (bool)(Curl_ascii_equal("ftp", conn->protostr) ||
+                          Curl_ascii_equal("ftps", conn->protostr));
 
       /*
        * This synthesized URL isn't always right--suffixes like ;type=A
index b547eb5f1e07ebde3af185297974db7c968954e4..6f1e9b47cf0956651a60b8209ab5c5dd8d88d919 100644 (file)
@@ -1501,11 +1501,11 @@ static ParameterError add2list(struct curl_slist **list,
 
 static int ftpfilemethod(struct Configurable *config, const char *str)
 {
-  if(curlx_strequal("singlecwd", str))
+  if(curlx_ascii_equal("singlecwd", str))
     return CURLFTPMETHOD_SINGLECWD;
-  if(curlx_strequal("nocwd", str))
+  if(curlx_ascii_equal("nocwd", str))
     return CURLFTPMETHOD_NOCWD;
-  if(curlx_strequal("multicwd", str))
+  if(curlx_ascii_equal("multicwd", str))
     return CURLFTPMETHOD_MULTICWD;
   warnf(config, "unrecognized ftp file method '%s', using default\n", str);
   return CURLFTPMETHOD_MULTICWD;
@@ -1513,9 +1513,9 @@ static int ftpfilemethod(struct Configurable *config, const char *str)
 
 static int ftpcccmethod(struct Configurable *config, const char *str)
 {
-  if(curlx_strequal("passive", str))
+  if(curlx_ascii_equal("passive", str))
     return CURLFTPSSL_CCC_PASSIVE;
-  if(curlx_strequal("active", str))
+  if(curlx_ascii_equal("active", str))
     return CURLFTPSSL_CCC_ACTIVE;
   warnf(config, "unrecognized ftp CCC method '%s', using default\n", str);
   return CURLFTPSSL_CCC_PASSIVE;
@@ -1765,7 +1765,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
       if(curlx_strnequal(aliases[j].lname, word, fnam)) {
         longopt = TRUE;
         numhits++;
-        if(curlx_strequal(aliases[j].lname, word)) {
+        if(curlx_ascii_equal(aliases[j].lname, word)) {
           parse = aliases[j].letter;
           hit = j;
           numhits = 1; /* a single unique hit */
@@ -2450,7 +2450,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
         break;
       case 'f': /* crypto engine */
         GetStr(&config->engine, nextarg);
-        if (config->engine && curlx_strequal(config->engine,"list"))
+        if (config->engine && curlx_ascii_equal(config->engine,"list"))
            config->list_engines = TRUE;
         break;
       case 'g': /* CA info PEM file */