X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=encode.c;h=5203a98c9bf7be5c7c9d4a6f621894dba98dea07;hp=189dfee013f47b777bd6e1be875bbf6879734d35;hb=6bf286721045589f54e58247a54d9dc89db53c52;hpb=72081f829de368392d04076728f8c991178c0080 diff --git a/encode.c b/encode.c index 189dfee0..5203a98c 100644 --- a/encode.c +++ b/encode.c @@ -1,19 +1,19 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.8 2002/03/26 22:29:54 swa Exp $"; +const char encode_rcs[] = "$Id: encode.c,v 1.21 2011/11/06 11:42:14 fabiankeil Exp $"; /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/Attic/encode.c,v $ + * File : $Source: /cvsroot/ijbswa/current/encode.c,v $ * * Purpose : Functions to encode and decode URLs, and also to * encode cookies and HTML text. * - * Copyright : Written by and Copyright (C) 2001 the SourceForge + * Copyright : Written by and Copyright (C) 2001 the * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -31,45 +31,17 @@ const char encode_rcs[] = "$Id: encode.c,v 1.8 2002/03/26 22:29:54 swa Exp $"; * or write to the Free Software Foundation, Inc., 59 * Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Revisions : - * $Log: encode.c,v $ - * 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 - * - * Revision 1.6 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.5 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.4 2002/01/22 23:28:07 jongfoster - * Adding convenience function html_encode_and_free_original() - * Making all functions accept NULL paramaters - in this case, they - * simply return NULL. This allows error-checking to be deferred. - * - * Revision 1.3 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.2 2001/05/17 22:52:35 oes - * - Cleaned CRLF's from the sources and related files - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * - * *********************************************************************/ - + #include "config.h" #include #include #include +#include +#include "miscutil.h" #include "encode.h" const char encode_h_rcs[] = ENCODE_H_VERSION; @@ -79,7 +51,7 @@ static const char * const url_code_map[256] = { NULL, "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", "%18", "%19", "%1A", "%1B", "%1C", "%1D", - "%1E", "%1F", "+", "%21", "%22", "%23", "%24", "%25", "%26", "%27", + "%1E", "%1F", "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29", NULL, "%2B", "%2C", NULL, NULL, "%2F", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "%3A", "%3B", "%3C", "%3D", "%3E", "%3F", NULL, NULL, NULL, NULL, NULL, NULL, @@ -104,12 +76,12 @@ static const char * const url_code_map[256] = { "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" }; -/* Maps special characters in HTML to their equivalent entites. */ +/* Maps special characters in HTML to their equivalent entities. */ static const char * const html_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,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, @@ -134,36 +106,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 -}; - /********************************************************************* * @@ -177,7 +119,7 @@ static const char * const cookie_code_map[256] = { * Parameters : * 1 : s = String to encode. Null-terminated. * - * Returns : Encoded string, newly allocated on the heap. + * 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. * @@ -185,14 +127,16 @@ static const char * const cookie_code_map[256] = { char * html_encode(const char *s) { char * buf; - + size_t buf_size; + if (s == NULL) { return NULL; } /* 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) { @@ -203,8 +147,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 { @@ -215,6 +160,7 @@ char * html_encode(const char *s) *p = '\0'; } + assert(strlen(buf) < buf_size); return(buf); } @@ -232,7 +178,7 @@ char * html_encode(const char *s) * Parameters : * 1 : s = String to encode. Null-terminated. * - * Returns : Encoded string, newly allocated on the heap. + * 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. * @@ -240,7 +186,7 @@ char * html_encode(const char *s) char * html_encode_and_free_original(char *s) { char * result; - + if (s == NULL) { return NULL; @@ -253,58 +199,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 @@ -313,10 +207,13 @@ char * cookie_encode(const char *s) * query string. Replaces special characters with * the appropriate %xx codes. * + * XXX: url_query_encode() would be a more fitting + * name. + * * Parameters : * 1 : s = String to encode. Null-terminated. * - * Returns : Encoded string, newly allocated on the heap. + * 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. * @@ -324,6 +221,7 @@ char * cookie_encode(const char *s) char * url_encode(const char *s) { char * buf; + size_t buf_size; if (s == NULL) { @@ -331,7 +229,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) { @@ -342,8 +241,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 { @@ -355,6 +255,7 @@ char * url_encode(const char *s) } + assert(strlen(buf) < buf_size); return(buf); } @@ -377,7 +278,7 @@ static int xdtoi(const int d) { return(d - '0'); } - else if ((d >= 'a') && (d <= 'f')) + else if ((d >= 'a') && (d <= 'f')) { return(d - 'a' + 10); } @@ -405,14 +306,14 @@ 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; + int d1; d1 = xdtoi(*s); if(d1 >= 0) { - d2 = xdtoi(*(s+1)); + int d2 = xdtoi(*(s+1)); if(d2 >= 0) { return (d1 << 4) + d2; @@ -433,7 +334,7 @@ static int xtoi(const char *s) * Parameters : * 1 : s = String to decode. Null-terminated. * - * Returns : Decoded string, newly allocated on the heap. + * Returns : Decoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). * *********************************************************************/ @@ -454,7 +355,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++;