aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Fandrich <dan@coneharvesters.com>2008-10-23 01:20:57 +0000
committerDan Fandrich <dan@coneharvesters.com>2008-10-23 01:20:57 +0000
commitbab5183820dbd2e0ea9ee4f0442844291d05c90e (patch)
tree3d6ff5612852ebe99afe0d83d2419ef1909d7a5a
parent0abaf2246777df3b06abc3430315d704c808ef4e (diff)
Created Curl_raw_nequal() which does a C-locale string case comparison.
Changed checkprefix() to use it and those instances of strnequal() that compare host names or other protocol strings that are defined to be independent of case in the C locale. This should fix a few more Turkish locale problems.
-rw-r--r--lib/cookie.c2
-rw-r--r--lib/dict.c12
-rw-r--r--lib/ftp.c2
-rw-r--r--lib/http.c11
-rw-r--r--lib/security.c2
-rw-r--r--lib/ssh.c2
-rw-r--r--lib/sslgen.c4
-rw-r--r--lib/strequal.c16
-rw-r--r--lib/strequal.h9
-rw-r--r--lib/url.c2
10 files changed, 38 insertions, 24 deletions
diff --git a/lib/cookie.c b/lib/cookie.c
index f2de8eaf9..fed4a44f6 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -131,7 +131,7 @@ static bool tailmatch(const char *little, const char *bigone)
if(littlelen > biglen)
return FALSE;
- return (bool)strequal(little, bigone+biglen-littlelen);
+ return (bool)Curl_raw_equal(little, bigone+biglen-littlelen);
}
/*
diff --git a/lib/dict.c b/lib/dict.c
index b1f5b6810..f9ce50efc 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -163,9 +163,9 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
/* AUTH is missing */
}
- if(strnequal(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
- strnequal(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
- strnequal(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
+ if(Curl_raw_nequal(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
+ Curl_raw_nequal(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
+ Curl_raw_nequal(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
word = strchr(path, ':');
if(word) {
@@ -222,9 +222,9 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(result)
return result;
}
- else if(strnequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
- strnequal(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
- strnequal(path, DICT_DEFINE3, sizeof(DICT_DEFINE3)-1)) {
+ else if(Curl_raw_nequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
+ Curl_raw_nequal(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
+ Curl_raw_nequal(path, DICT_DEFINE3, sizeof(DICT_DEFINE3)-1)) {
word = strchr(path, ':');
if(word) {
diff --git a/lib/ftp.c b/lib/ftp.c
index ca8ef1135..cdce06061 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -4019,7 +4019,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
dlen -= ftpc->file?strlen(ftpc->file):0;
if((dlen == (int)strlen(ftpc->prevpath)) &&
- curl_strnequal(path, ftpc->prevpath, dlen)) {
+ strnequal(path, ftpc->prevpath, dlen)) {
infof(data, "Request has same path as previous transfer\n");
ftpc->cwddone = TRUE;
}
diff --git a/lib/http.c b/lib/http.c
index b1b70ce4e..503ceb0c1 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -173,7 +173,7 @@ static char *checkheaders(struct SessionHandle *data, const char *thisheader)
size_t thislen = strlen(thisheader);
for(head = data->set.headers; head; head=head->next) {
- if(strnequal(head->data, thisheader, thislen))
+ if(Curl_raw_nequal(head->data, thisheader, thislen))
return head->data;
}
return NULL;
@@ -1246,7 +1246,7 @@ Curl_compareheader(const char *headerline, /* line to check */
const char *start;
const char *end;
- if(!strnequal(headerline, header, hlen))
+ if(!Curl_raw_nequal(headerline, header, hlen))
return FALSE; /* doesn't start with header */
/* pass the header */
@@ -1272,7 +1272,7 @@ Curl_compareheader(const char *headerline, /* line to check */
/* find the content string in the rest of the line */
for(;len>=clen;len--, start++) {
- if(strnequal(start, content, clen))
+ if(Curl_raw_nequal(start, content, clen))
return TRUE; /* match! */
}
@@ -2026,12 +2026,11 @@ static CURLcode add_custom_headers(struct connectdata *conn,
if(conn->allocptr.host &&
/* a Host: header was sent already, don't pass on any custom Host:
header as that will produce *two* in the same request! */
- curl_strnequal("Host:", headers->data, 5))
+ checkprefix("Host:", headers->data))
;
else if(conn->data->set.httpreq == HTTPREQ_POST_FORM &&
/* this header (extended by formdata.c) is sent later */
- curl_strnequal("Content-Type:", headers->data,
- strlen("Content-Type:")))
+ checkprefix("Content-Type:", headers->data))
;
else {
CURLcode result = add_bufferf(req_buffer, "%s\r\n", headers->data);
diff --git a/lib/security.c b/lib/security.c
index bec751045..01143938a 100644
--- a/lib/security.c
+++ b/lib/security.c
@@ -85,7 +85,7 @@ name_to_level(const char *name)
{
int i;
for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++)
- if(curl_strnequal(level_names[i].name, name, strlen(name)))
+ if(checkprefix(name, level_names[i].name))
return level_names[i].level;
return (enum protection_level)-1;
}
diff --git a/lib/ssh.c b/lib/ssh.c
index 32057a3c4..6d2108bef 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -822,7 +822,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn)
/*
* Support some of the "FTP" commands
*/
- if(curl_strnequal(sshc->quote_item->data, "PWD", 3)) {
+ if(curl_strequal("pwd", sshc->quote_item->data)) {
/* output debug output if that is requested */
if(data->set.verbose) {
char tmp[PATH_MAX+1];
diff --git a/lib/sslgen.c b/lib/sslgen.c
index eee46b912..1bfeda713 100644
--- a/lib/sslgen.c
+++ b/lib/sslgen.c
@@ -64,8 +64,6 @@
/* The last #include file should be: */
#include "memdebug.h"
-static bool safe_strequal(char* str1, char* str2);
-
static bool safe_strequal(char* str1, char* str2)
{
if(str1 && str2)
@@ -228,7 +226,7 @@ int Curl_ssl_getsessionid(struct connectdata *conn,
if(!check->sessionid)
/* not session ID means blank entry */
continue;
- if(curl_strequal(conn->host.name, check->name) &&
+ if(Curl_raw_equal(conn->host.name, check->name) &&
(conn->remote_port == check->remote_port) &&
Curl_ssl_config_matches(&conn->ssl_config, &check->ssl_config)) {
/* yes, we have a session ID! */
diff --git a/lib/strequal.c b/lib/strequal.c
index 5065b3871..3d00aa213 100644
--- a/lib/strequal.c
+++ b/lib/strequal.c
@@ -161,6 +161,22 @@ int Curl_raw_equal(const char *first, const char *second)
return (my_toupper(*first) == my_toupper(*second));
}
+int Curl_raw_nequal(const char *first, const char *second, size_t max)
+{
+ while(*first && *second && max) {
+ if(my_toupper(*first) != my_toupper(*second)) {
+ break;
+ }
+ max--;
+ first++;
+ second++;
+ }
+ if(0 == max)
+ return 1; /* they are equal this far */
+
+ return my_toupper(*first) == my_toupper(*second);
+}
+
#ifndef HAVE_STRLCAT
/*
* The strlcat() function appends the NUL-terminated string src to the end
diff --git a/lib/strequal.h b/lib/strequal.h
index 778b23cd9..eac400202 100644
--- a/lib/strequal.h
+++ b/lib/strequal.h
@@ -28,10 +28,6 @@
#define strequal(a,b) curl_strequal(a,b)
#define strnequal(a,b,c) curl_strnequal(a,b,c)
-/* checkprefix() is a shorter version of the above, used when the first
- argument is zero-byte terminated */
-#define checkprefix(a,b) strnequal(a,b,strlen(a))
-
/*
* Curl_raw_equal() is for doing "raw" case insensitive strings. This is meant
* to be locale independent and only compare strings we know are safe for
@@ -40,6 +36,11 @@
* The function is capable of comparing a-z case insensitively even for non-ascii.
*/
int Curl_raw_equal(const char *first, const char *second);
+int Curl_raw_nequal(const char *first, const char *second, size_t max);
+
+/* checkprefix() is a shorter version of the above, used when the first
+ argument is zero-byte terminated */
+#define checkprefix(a,b) Curl_raw_nequal(a,b,strlen(a))
#ifndef HAVE_STRLCAT
#define strlcat(x,y,z) Curl_strlcat(x,y,z)
diff --git a/lib/url.c b/lib/url.c
index a21cda0ae..bf77eab95 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -3337,7 +3337,7 @@ static char *detect_proxy(struct connectdata *conn)
if(!no_proxy)
no_proxy=curl_getenv("NO_PROXY");
- if(!no_proxy || !strequal("*", no_proxy)) {
+ if(!no_proxy || !Curl_raw_equal("*", no_proxy)) {
/* NO_PROXY wasn't specified or it wasn't just an asterisk */
char *nope;