1 - allow DICT with properly URL-escaped words, like using %20 for spaces

2 - properly escape certain letters within a DICT word to comply to the RFC2229
This commit is contained in:
Daniel Stenberg 2006-05-10 11:44:31 +00:00
parent 00312e95fe
commit 3c6d3b69c2
3 changed files with 62 additions and 2 deletions

View File

@ -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

View 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

View File

@ -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