From 5591550167092c0e5f307b3c2c87f44518e7159f Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Wed, 21 Jan 2009 04:42:47 +0000 Subject: [PATCH] Fixed a couple more locale-dependent toupper conversions, mainly for clarity. This does fix one problem that causes ;type=i FTP URLs to fail in the Turkish locale when CURLOPT_PROXY_TRANSFER_MODE is used (test case 561) Added tests 561 and 1092 through 1094 to test various combinations of ;type= and ;mode= URLs that could potentially fail in the Turkish locale. --- CHANGES | 13 +++++++++ RELEASE-NOTES | 1 + lib/ftp.c | 3 +- lib/http.c | 2 +- lib/http_ntlm.c | 21 +++++--------- lib/rawstr.c | 12 ++++---- lib/rawstr.h | 2 ++ lib/ssluse.c | 2 +- lib/tftp.c | 3 +- lib/url.c | 18 ++++++++++-- lib/url.h | 1 + tests/data/Makefile.am | 2 +- tests/data/test1091 | 46 +++++++++++++++++++++++++++++ tests/data/test1092 | 55 +++++++++++++++++++++++++++++++++++ tests/data/test1093 | 44 ++++++++++++++++++++++++++++ tests/data/test1094 | 50 ++++++++++++++++++++++++++++++++ tests/data/test561 | 66 ++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 314 insertions(+), 27 deletions(-) create mode 100644 tests/data/test1091 create mode 100644 tests/data/test1092 create mode 100644 tests/data/test1093 create mode 100644 tests/data/test1094 create mode 100644 tests/data/test561 diff --git a/CHANGES b/CHANGES index 04123e9b0..4c40fd5a0 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,19 @@ Changelog +Daniel Fandrich (20 Jan 2009) +- Call setlocale() for libtest tests to test the effects of locale-induced + libc changes on libcurl. + +- Fixed a couple more locale-dependent toupper conversions, mainly for + clarity. This does fix one problem that causes ;type=i FTP URLs + to fail in the Turkish locale when CURLOPT_PROXY_TRANSFER_MODE is + used (test case 561) + +- Added tests 561 and 1091 through 1094 to test various combinations + of ;type= and ;mode= URLs that could potentially fail in the Turkish + locale. + Daniel Stenberg (20 Jan 2009) - Lisa Xu pointed out that the ssh.obj file was missing from the lib/Makefile.vc6 file (and thus from the vc8 and vc9 ones too). diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 55d6c8efb..8f29683ec 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -14,6 +14,7 @@ This release includes the following changes: This release includes the following bugfixes: o missing ssh.obj in VS makefiles + o FTP ;type=i URLs now work with CURLOPT_PROXY_TRANSFER_MODE in Turkish locale This release includes the following known bugs: diff --git a/lib/ftp.c b/lib/ftp.c index 53542ecbc..66933d673 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -89,6 +89,7 @@ #include "sockaddr.h" /* required for Curl_sockaddr_storage */ #include "multiif.h" #include "url.h" +#include "rawstr.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -4141,7 +4142,7 @@ static CURLcode ftp_setup_connection(struct connectdata * conn) if(type) { *type = 0; /* it was in the middle of the hostname */ - command = (char) toupper((int) type[6]); + command = Curl_raw_toupper(type[6]); switch (command) { case 'A': /* ASCII mode */ diff --git a/lib/http.c b/lib/http.c index eaa50eeef..b96d51d78 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2271,7 +2271,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) { char *p = strstr(ppath, ";type="); if(p && p[6] && p[7] == 0) { - switch (toupper((int)((unsigned char)p[6]))) { + switch (Curl_raw_toupper(p[6])) { case 'A': case 'D': case 'I': diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c index afed953e2..869a247a0 100644 --- a/lib/http_ntlm.c +++ b/lib/http_ntlm.c @@ -323,7 +323,7 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, * Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The * key schedule ks is also set. */ -static void setup_des_key(unsigned char *key_56, +static void setup_des_key(const unsigned char *key_56, DES_key_schedule DESKEYARG(ks)) { DES_cblock key; @@ -346,9 +346,9 @@ static void setup_des_key(unsigned char *key_56, * 8 byte plaintext is encrypted with each key and the resulting 24 * bytes are stored in the results array. */ -static void lm_resp(unsigned char *keys, - unsigned char *plaintext, - unsigned char *results) +static void lm_resp(const unsigned char *keys, + const unsigned char *plaintext, + unsigned char *results) { DES_key_schedule ks; @@ -377,17 +377,10 @@ static void mk_lm_hash(struct SessionHandle *data, static const unsigned char magic[] = { 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 /* i.e. KGS!@#$% */ }; - unsigned int i; - size_t len = strlen(password); + size_t len = CURLMIN(strlen(password), 14); - if(len > 14) - len = 14; - - for (i=0; i @@ -904,7 +905,7 @@ static CURLcode tftp_setup_connection(struct connectdata * conn) if(type) { *type = 0; /* it was in the middle of the hostname */ - command = (char) toupper((int) type[6]); + command = Curl_raw_toupper(type[6]); switch (command) { case 'A': /* ASCII mode */ diff --git a/lib/url.c b/lib/url.c index 0145d4935..47d2af342 100644 --- a/lib/url.c +++ b/lib/url.c @@ -230,6 +230,21 @@ void Curl_safefree(void *ptr) free(ptr); } +/* Copy an upper case version of the string from src to dest. The + * strings may overlap. No more than n characters of the string are copied + * (including any NUL) and the destination string will NOT be + * NUL-terminated if that limit is reached. + */ +void Curl_strntoupper(char *dest, const char *src, size_t n) +{ + if (n < 1) + return; + + do { + *dest++ = Curl_raw_toupper(*src); + } while (*src++ && --n); +} + static void close_connections(struct SessionHandle *data) { /* Loop through all open connections and kill them one by one */ @@ -3441,8 +3456,7 @@ static char *detect_proxy(struct connectdata *conn) */ if(!prox && !Curl_raw_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); + Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env)); prox=curl_getenv(proxy_env); } diff --git a/lib/url.h b/lib/url.h index 2c60507c3..ec4da99c2 100644 --- a/lib/url.h +++ b/lib/url.h @@ -48,6 +48,7 @@ CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done); CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done); CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done); void Curl_safefree(void *ptr); +void Curl_strntoupper(char *dest, const char *src, size_t n); /* create a connection cache */ struct conncache *Curl_mk_connc(int type, long amount); diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 85a90dc95..4a459e012 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -60,7 +60,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 \ test1080 test1081 test1082 test1083 test1084 test1085 test633 test634 \ test635 test636 test637 test558 test559 test1086 test1087 test1088 \ - test1089 test1090 + test1089 test1090 test1091 test1092 test1093 test1094 filecheck: @mkdir test-place; \ diff --git a/tests/data/test1091 b/tests/data/test1091 new file mode 100644 index 000000000..f3ce8608a --- /dev/null +++ b/tests/data/test1091 @@ -0,0 +1,46 @@ + +# based on test 143 + + +FTP +RETR +type= + + + +# Server-side + + +bla bla bla + + + +# Client-side + + +ftp + + +FTP URL with type=i + + +"ftp://%HOSTIP:%FTPPORT/%2ftmp/moo/1091;type=i" --use-ascii + + + +# Verify data after the test has been "shot" + + +USER anonymous +PASS ftp@example.com +PWD +CWD /tmp +CWD moo +EPSV +TYPE I +SIZE 1091 +RETR 1091 +QUIT + + + diff --git a/tests/data/test1092 b/tests/data/test1092 new file mode 100644 index 000000000..26c4e059f --- /dev/null +++ b/tests/data/test1092 @@ -0,0 +1,55 @@ + + + +FTP +HTTP +HTTP GET +HTTP proxy + + +# +# Server-side + + +HTTP/1.0 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Funny-head: yesyes + +contents + + + +# +# Client-side + + +http + + +ftp + + +FTP over HTTP proxy + + +"ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1092;type=i" --use-ascii -x %HOSTIP:%HTTPPORT + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1092;type=i HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Proxy-Connection: Keep-Alive + + + + diff --git a/tests/data/test1093 b/tests/data/test1093 new file mode 100644 index 000000000..dbcfd9f7a --- /dev/null +++ b/tests/data/test1093 @@ -0,0 +1,44 @@ + + + +TFTP +TFTP RRQ +mode= + + + +# +# Server-side + + +a chunk of +data +returned + to client + + + +# +# Client-side + + +tftp + + +TFTP retrieve with mode=i + + +"tftp://%HOSTIP:%TFTPPORT//1093;mode=i" --use-ascii --trace-ascii log/traceit + + + +# +# Verify pseudo protocol after the test has been "shot" + + +opcode: 1 +filename: /1093 +mode: octet + + + diff --git a/tests/data/test1094 b/tests/data/test1094 new file mode 100644 index 000000000..29965505f --- /dev/null +++ b/tests/data/test1094 @@ -0,0 +1,50 @@ + + + +TFTP +TFTP RRQ +mode= + + + +# +# Server-side + + +a chunk of +data +returned + to client + + +a chunk of +data +returned + to client + + + +# +# Client-side + + +tftp + + +TFTP retrieve with mode=netascii + + +"tftp://%HOSTIP:%TFTPPORT//1094;mode=netascii" --trace-ascii log/traceit + + + +# +# Verify pseudo protocol after the test has been "shot" + + +opcode: 1 +filename: /1094 +mode: netascii + + + diff --git a/tests/data/test561 b/tests/data/test561 new file mode 100644 index 000000000..18e827c10 --- /dev/null +++ b/tests/data/test561 @@ -0,0 +1,66 @@ + + + +FTP +HTTP proxy +CURLOPT_PROXY_TRANSFER_MODE +CURLOPT_PROXY +type= + + + +# +# Server-side + + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 + +hello + + + +# +# Client-side + + +http + + +ftp + + +lib549 + + +FTP RETR with CURLOPT_PROXY_TRANSFER_MODE, ASCII transfer and type=i + +# first URL then proxy + +"ftp://www.haxx.se/moo/561;type=i" http://%HOSTIP:%HTTPPORT ascii + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET ftp://www.haxx.se/moo/561;type=i HTTP/1.1 +Host: www.haxx.se:21 +Accept: */* +Proxy-Connection: Keep-Alive + + + +hello + + +