1 - allow DICT with properly URL-escaped words, like using %20 for spaces
authorDaniel Stenberg <daniel@haxx.se>
Wed, 10 May 2006 11:44:31 +0000 (11:44 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 10 May 2006 11:44:31 +0000 (11:44 +0000)
2 - properly escape certain letters within a DICT word to comply to the RFC2229

CHANGES
RELEASE-NOTES
lib/dict.c

diff --git a/CHANGES b/CHANGES
index 8af4450..c700e2f 100644 (file)
--- 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
index 2f9909d..3d42c7b 100644 (file)
@@ -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
index b7efa02..d5a2400 100644 (file)
 #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