X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=encode.c;h=4207266491e881827db96edd348d8e77665e6fd7;hp=09c7b5f79ddf7c21feaf9e70aa88cb20a4eff8f6;hb=96a70945adcf3e57b9b9475f8e6da48d5d325d6f;hpb=97110184221edacdb7d4dfc29de0e38d63f4d831 diff --git a/encode.c b/encode.c index 09c7b5f7..42072664 100644 --- a/encode.c +++ b/encode.c @@ -1,4 +1,4 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; +const char encode_rcs[] = "$Id: encode.c,v 1.13 2007/08/18 14:34:27 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/encode.c,v $ @@ -33,6 +33,22 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: encode.c,v $ + * Revision 1.13 2007/08/18 14:34:27 fabiankeil + * Make xtoi() extern so it can be used in pcrs.c. + * + * Revision 1.12 2007/08/04 10:15:51 fabiankeil + * Use strlcpy() instead of strcpy(). + * + * Revision 1.11 2006/12/28 18:25:53 fabiankeil + * Fixed gcc43 compiler warning. + * + * Revision 1.10 2006/07/18 14:48:45 david__schmidt + * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) + * with what was really the latest development (the v_3_0_branch branch) + * + * Revision 1.8 2002/03/26 22:29:54 swa + * we have a new homepage! + * * Revision 1.7 2002/03/24 13:25:43 swa * name change related issues * @@ -66,7 +82,9 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; #include #include #include +#include +#include "miscutil.h" #include "encode.h" const char encode_h_rcs[] = ENCODE_H_VERSION; @@ -131,36 +149,6 @@ static const char * const html_code_map[256] = { NULL, NULL, NULL, NULL, NULL, NULL }; -/* Maps special characters in a cookie to their equivalent % codes. */ -static const char * const cookie_code_map[256] = { - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, "+", NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, "%2C",NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "%3B", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL -}; - /********************************************************************* * @@ -182,6 +170,7 @@ static const char * const cookie_code_map[256] = { char * html_encode(const char *s) { char * buf; + size_t buf_size; if (s == NULL) { @@ -189,7 +178,8 @@ char * html_encode(const char *s) } /* each input char can expand to at most 6 chars */ - buf = (char *) malloc((strlen(s) * 6) + 1); + buf_size = (strlen(s) * 6) + 1; + buf = (char *) malloc(buf_size); if (buf) { @@ -200,8 +190,9 @@ char * html_encode(const char *s) const char * replace_with = html_code_map[(unsigned char) c]; if(replace_with != NULL) { - strcpy(p, replace_with); - p += strlen(replace_with); + const size_t bytes_written = (size_t)(p - buf); + assert(bytes_written < buf_size); + p += strlcpy(p, replace_with, buf_size - bytes_written); } else { @@ -212,6 +203,7 @@ char * html_encode(const char *s) *p = '\0'; } + assert(strlen(buf) < buf_size); return(buf); } @@ -250,58 +242,6 @@ char * html_encode_and_free_original(char *s) } -/********************************************************************* - * - * Function : cookie_encode - * - * Description : Encodes a string so it can be used in a cookie. - * Replaces " ", ",", and ";" with the appropriate - * codes. - * - * Parameters : - * 1 : s = String to encode. Null-terminated. - * - * Returns : Encoded string, newly allocated on the heap. - * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. - * - *********************************************************************/ -char * cookie_encode(const char *s) -{ - char * buf; - - if (s == NULL) - { - return NULL; - } - - /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); - - if (buf) - { - char c; - char * p = buf; - while ( (c = *s++) != '\0') - { - const char * replace_with = cookie_code_map[(unsigned char) c]; - if (replace_with != NULL) - { - strcpy(p, replace_with); - p += strlen(replace_with); - } - else - { - *p++ = c; - } - } - - *p = '\0'; - } - - return(buf); -} - /********************************************************************* * * Function : url_encode @@ -321,6 +261,7 @@ char * cookie_encode(const char *s) char * url_encode(const char *s) { char * buf; + size_t buf_size; if (s == NULL) { @@ -328,7 +269,8 @@ char * url_encode(const char *s) } /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); + buf_size = (strlen(s) * 3) + 1; + buf = (char *) malloc(buf_size); if (buf) { @@ -339,8 +281,9 @@ char * url_encode(const char *s) const char * replace_with = url_code_map[(unsigned char) c]; if (replace_with != NULL) { - strcpy(p, replace_with); - p += strlen(replace_with); + const size_t bytes_written = (size_t)(p - buf); + assert(bytes_written < buf_size); + p += strlcpy(p, replace_with, buf_size - bytes_written); } else { @@ -352,6 +295,7 @@ char * url_encode(const char *s) } + assert(strlen(buf) < buf_size); return(buf); } @@ -402,7 +346,7 @@ static int xdtoi(const int d) * Returns : The integer value, or 0 for non-hex strings. * *********************************************************************/ -static int xtoi(const char *s) +int xtoi(const char *s) { int d1, d2; @@ -451,7 +395,7 @@ char *url_decode(const char * s) break; case '%': - if ((*q = xtoi(s + 1)) != '\0') + if ((*q = (char)xtoi(s + 1)) != '\0') { s += 3; q++;