X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=encode.c;h=4207266491e881827db96edd348d8e77665e6fd7;hp=42d07443d7cf4c0608f93c10bb806b76bb60ff8a;hb=92f1c5a1258893f24b4236a31983a5cf1a5b262a;hpb=c75584ebcc79f939fb4ec9c8f842cef6692640c7 diff --git a/encode.c b/encode.c index 42d07443..42072664 100644 --- a/encode.c +++ b/encode.c @@ -1,13 +1,13 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.1 2001/05/13 21:57:06 administrator Exp $"; +const char encode_rcs[] = "$Id: encode.c,v 1.13 2007/08/18 14:34:27 fabiankeil Exp $"; /********************************************************************* * - * File : $Source: /home/administrator/cvs/ijb/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 - * IJBSWA team. http://ijbswa.sourceforge.net + * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -33,6 +33,46 @@ const char encode_rcs[] = "$Id: encode.c,v 1.1 2001/05/13 21:57:06 administrator * * 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 + * + * 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 + * * *********************************************************************/ @@ -40,9 +80,11 @@ const char encode_rcs[] = "$Id: encode.c,v 1.1 2001/05/13 21:57:06 administrator #include "config.h" #include +#include #include -#include - +#include + +#include "miscutil.h" #include "encode.h" const char encode_h_rcs[] = ENCODE_H_VERSION; @@ -107,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 -}; - /********************************************************************* * @@ -152,12 +164,22 @@ static const char * const cookie_code_map[256] = { * * 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 * 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 */ - char * buf = (char *) malloc((strlen(s) * 6) + 1); + buf_size = (strlen(s) * 6) + 1; + buf = (char *) malloc(buf_size); if (buf) { @@ -168,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 { @@ -180,59 +203,51 @@ char * html_encode(const char *s) *p = '\0'; } + assert(strlen(buf) < buf_size); return(buf); } + /********************************************************************* * - * Function : cookie_encode + * Function : html_encode_and_free_original * - * Description : Encodes a string so it can be used in a cookie. - * Replaces " ", ",", and ";" with the appropriate - * codes. + * Description : Encodes a string so it's not interpreted as + * containing HTML tags or entities. + * Replaces <, >, &, and " with the appropriate HTML + * entities. Free()s original string. + * If original string is NULL, simply returns NULL. * * 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 * html_encode_and_free_original(char *s) { - /* each input char can expand to at most 3 chars */ - char * buf = (char *) malloc((strlen(s) * 3) + 1); - - if (buf) + char * result; + + if (s == NULL) { - 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 NULL; } - return(buf); + result = html_encode(s); + free(s); + + return result; } + /********************************************************************* * * Function : url_encode * * Description : Encodes a string so it can be used in a URL - * query string. Replaces special characters with + * query string. Replaces special characters with * the appropriate %xx codes. * * Parameters : @@ -240,15 +255,25 @@ char * cookie_encode(const char *s) * * 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 * url_encode(const char *s) -{ - /* each input char can expand to at most 3 chars */ - char * buf = (char *) malloc((strlen(s) * 3) + 1); - +{ + char * buf; + size_t buf_size; + + if (s == NULL) + { + return NULL; + } + + /* each input char can expand to at most 3 chars */ + buf_size = (strlen(s) * 3) + 1; + buf = (char *) malloc(buf_size); + if (buf) - { + { char c; char * p = buf; while( (c = *s++) != '\0') @@ -256,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 { @@ -266,9 +292,10 @@ char * url_encode(const char *s) } *p = '\0'; - + } - + + assert(strlen(buf) < buf_size); return(buf); } @@ -285,7 +312,7 @@ char * url_encode(const char *s) * Returns : The integer value, or -1 for non-hex characters. * *********************************************************************/ -static int xdtoi(char d) +static int xdtoi(const int d) { if ((d >= '0') && (d <= '9')) { @@ -319,14 +346,14 @@ static int xdtoi(char 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; - d1 = xdtoi(*s++); + d1 = xdtoi(*s); if(d1 >= 0) { - d2 = xdtoi(*s); + d2 = xdtoi(*(s+1)); if(d2 >= 0) { return (d1 << 4) + d2; @@ -355,9 +382,9 @@ char *url_decode(const char * s) { char *buf = malloc(strlen(s) + 1); char *q = buf; - - if (buf) - { + + if (buf) + { while (*s) { switch (*s) @@ -368,7 +395,7 @@ char *url_decode(const char * s) break; case '%': - if ((*q = xtoi(s + 1))) + if ((*q = (char)xtoi(s + 1)) != '\0') { s += 3; q++; @@ -385,9 +412,9 @@ char *url_decode(const char * s) break; } } - *q = '\0'; + *q = '\0'; } - + return(buf); }