diff --git a/CHANGES b/CHANGES index 8af44505f..c700e2f64 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Changelog +Daniel (10 May 2006) +- Fixed DICT in two aspects: + + 1 - allow properly URL-escaped words, like using %20 for spaces + + 2 - properly escape certain letters within a word to comply to the RFC2229 + Daniel (9 May 2006) - Andreas Ntaflos reported a bug in libcurl.m4: When configuring my GNU autotools project, which optionally (default=yes) uses libcurl on a system diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 2f9909d2e..3d42c7b8c 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -20,6 +20,8 @@ This release includes the following changes: This release includes the following bugfixes: + o dict with letters such as space in a word + o dict with url-encoded words in the URL o libcurl.m4 when default=yes but no libcurl was found o numerous bugs fixed in the TFTP code o possible memory leak when adding easy handles to multi stack diff --git a/lib/dict.c b/lib/dict.c index b7efa02a1..d5a2400ca 100644 --- a/lib/dict.c +++ b/lib/dict.c @@ -83,9 +83,46 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include +/* The last #include file should be: */ +#include "memdebug.h" + +static char *unescape_word(struct SessionHandle *data, char *inp) +{ + char *newp; + char *dictp; + char *ptr; + int len; + unsigned char byte; + int olen=0; + + newp = curl_easy_unescape(data, inp, 0, &len); + if(!newp) + return NULL; + + dictp = malloc(len*2 + 1); /* add one for terminating zero */ + if(dictp) { + /* According to RFC2229 section 2.2, these letters need to be escaped with + \[letter] */ + for(ptr = newp; + (byte = (unsigned char)*ptr); + ptr++) { + if ((byte <= 32) || (byte == 127) || + (byte == '\'') || (byte == '\"') || (byte == '\\')) { + dictp[olen++] = '\\'; + } + dictp[olen++] = byte; + } + dictp[olen]=0; + + free(newp); + } + return dictp; +} + CURLcode Curl_dict(struct connectdata *conn, bool *done) { char *word; + char *eword; char *ppath; char *database = NULL; char *strategy = NULL; @@ -135,6 +172,10 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done) strategy = (char *)"."; } + eword = unescape_word(data, word); + if(!eword) + return CURLE_OUT_OF_MEMORY; + result = Curl_sendf(sockfd, conn, "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" "MATCH " @@ -145,8 +186,11 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done) database, strategy, - word + eword ); + + free(eword); + if(result) failf(data, "Failed sending DICT request"); else @@ -179,6 +223,10 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done) database = (char *)"!"; } + eword = unescape_word(data, word); + if(!eword) + return CURLE_OUT_OF_MEMORY; + result = Curl_sendf(sockfd, conn, "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" "DEFINE " @@ -186,7 +234,10 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done) "%s\r\n" /* word */ "QUIT\r\n", database, - word); + eword); + + free(eword); + if(result) failf(data, "Failed sending DICT request"); else