aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--RELEASE-NOTES2
-rw-r--r--lib/dict.c55
3 files changed, 62 insertions, 2 deletions
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 <curl/mprintf.h>
+/* 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