cvs: php-src(PHP_4_3) /ext/standard url.c url.h

From: Date: Wed, 22 Sep 2004 00:51:51 +0000
Subject: cvs: php-src(PHP_4_3) /ext/standard url.c url.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-28731@lists.php.net to get a copy of this message
iliaa Tue Sep 21 20:51:51 2004 EDT Modified files: (Branch: PHP_4_3) /php-src/ext/standard url.c url.h Log: MFH: Fixed bug #29913 (parse_url() is now binary safe). (Ilia) http://cvs.php.net/diff.php/php-src/ext/standard/url.c?r1=1.58.2.15&r2=1.58.2.16&ty=u Index: php-src/ext/standard/url.c diff -u php-src/ext/standard/url.c:1.58.2.15 php-src/ext/standard/url.c:1.58.2.16 --- php-src/ext/standard/url.c:1.58.2.15 Fri May 28 07:33:42 2004 +++ php-src/ext/standard/url.c Tue Sep 21 20:51:51 2004 @@ -15,7 +15,7 @@ | Author: Jim Winstead <jimw@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: url.c,v 1.58.2.15 2004/05/28 11:33:42 sesser Exp $ */ +/* $Id: url.c,v 1.58.2.16 2004/09/22 00:51:51 iliaa Exp $ */ #include <stdlib.h> #include <string.h> @@ -60,15 +60,16 @@ /* {{{ php_replace_controlchars */ -PHPAPI char *php_replace_controlchars(char *str) +PHPAPI char *php_replace_controlchars_ex(char *str, int len) { unsigned char *s = (unsigned char *)str; + unsigned char *e = (unsigned char *)str + len; if (!str) { return (NULL); } - while (*s) { + while (s < e) { if (iscntrl(*s)) { *s='_'; @@ -79,11 +80,20 @@ return (str); } /* }}} */ - + +PHPAPI char *php_replace_controlchars(char *str) +{ + return php_replace_controlchars_ex(str, strlen(str)); +} + +PHPAPI php_url *php_url_parse(char const *str) +{ + return php_url_parse_ex(str, strlen(str)); +} /* {{{ php_url_parse */ -PHPAPI php_url *php_url_parse(char *str) +PHPAPI php_url *php_url_parse_ex(char const *str, int length) { int length = strlen(str); char port_buf[6]; @@ -94,7 +104,7 @@ ue = s + length; /* parse scheme */ - if ((e = strchr(s, ':')) && (e-s)) { + if ((e = memchr(s, ':', length)) && (e - s)) { /* * certain schemas like mailto: and zlib: may not have any / after them * this check ensures we support those. @@ -113,14 +123,14 @@ } ret->scheme = estrndup(s, (e-s)); - php_replace_controlchars(ret->scheme); + php_replace_controlchars_ex(ret->scheme, (e - s)); length -= ++e - s; s = e; goto just_path; } else { ret->scheme = estrndup(s, (e-s)); - php_replace_controlchars(ret->scheme); + php_replace_controlchars_ex(ret->scheme, (e - s)); if (*(e+2) == '/') { s = e + 3; @@ -130,8 +140,8 @@ } } } else { - s = e + 1; if (!strncasecmp("file", ret->scheme, sizeof("file"))) { + s = e + 1; goto nohost; } else { length -= ++e - s; @@ -164,8 +174,8 @@ e = ue; - if (!(p = strchr(s, '/'))) { - if ((p = strchr(s, '?'))) { + if (!(p = memchr(s, '/', (ue - s)))) { + if ((p = memchr(s, '?', (ue - s)))) { e = p; } } else { @@ -177,17 +187,17 @@ if ((pp = memchr(s, ':', (p-s)))) { if ((pp-s) > 0) { ret->user = estrndup(s, (pp-s)); - php_replace_controlchars(ret->user); + php_replace_controlchars_ex(ret->user, (pp - s)); } pp++; if (p-pp > 0) { ret->pass = estrndup(pp, (p-pp)); - php_replace_controlchars(ret->pass); + php_replace_controlchars_ex(ret->pass, (p-pp)); } } else { ret->user = estrndup(s, (p-s)); - php_replace_controlchars(ret->user); + php_replace_controlchars_ex(ret->user, (p-s)); } s = p + 1; @@ -235,7 +245,7 @@ } ret->host = estrndup(s, (p-s)); - php_replace_controlchars(ret->host); + php_replace_controlchars_ex(ret->host, (p - s)); if (e == ue) { return ret; @@ -245,7 +255,7 @@ nohost: - if ((p = strchr(s, '?'))) { + if ((p = memchr(s, '?', (ue - s)))) { pp = strchr(s, '#'); if (pp && pp < p) { @@ -255,24 +265,24 @@ if (p - s) { ret->path = estrndup(s, (p-s)); - php_replace_controlchars(ret->path); + php_replace_controlchars_ex(ret->path, (p - s)); } if (pp) { if (pp - ++p) { ret->query = estrndup(p, (pp-p)); - php_replace_controlchars(ret->query); + php_replace_controlchars_ex(ret->query, (pp - p)); } p = pp; goto label_parse; } else if (++p - ue) { ret->query = estrndup(p, (ue-p)); - php_replace_controlchars(ret->query); + php_replace_controlchars_ex(ret->query, (ue - p)); } - } else if ((p = strchr(s, '#'))) { + } else if ((p = memchr(s, '#', (ue - s)))) { if (p - s) { ret->path = estrndup(s, (p-s)); - php_replace_controlchars(ret->path); + php_replace_controlchars_ex(ret->path, (p - s)); } label_parse: @@ -280,11 +290,11 @@ if (ue - p) { ret->fragment = estrndup(p, (ue-p)); - php_replace_controlchars(ret->fragment); + php_replace_controlchars_ex(ret->fragment, (ue - p)); } } else { ret->path = estrndup(s, (ue-s)); - php_replace_controlchars(ret->path); + php_replace_controlchars_ex(ret->path, (ue - s)); } return ret; @@ -303,7 +313,7 @@ return; } - resource = php_url_parse(str); + resource = php_url_parse_ex(str, str_len); if (resource == NULL) { php_error_docref1(NULL TSRMLS_CC, str, E_WARNING, "Unable to parse url"); RETURN_FALSE; http://cvs.php.net/diff.php/php-src/ext/standard/url.h?r1=1.13.8.1&r2=1.13.8.2&ty=u Index: php-src/ext/standard/url.h diff -u php-src/ext/standard/url.h:1.13.8.1 php-src/ext/standard/url.h:1.13.8.2 --- php-src/ext/standard/url.h:1.13.8.1 Tue Dec 31 11:35:35 2002 +++ php-src/ext/standard/url.h Tue Sep 21 20:51:51 2004 @@ -15,7 +15,7 @@ | Author: Jim Winstead <jimw@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: url.h,v 1.13.8.1 2002/12/31 16:35:35 sebastian Exp $ */ +/* $Id: url.h,v 1.13.8.2 2004/09/22 00:51:51 iliaa Exp $ */ #ifndef URL_H #define URL_H @@ -32,7 +32,8 @@ } php_url; PHPAPI void php_url_free(php_url *theurl); -PHPAPI php_url *php_url_parse(char *str); +PHPAPI php_url *php_url_parse(char const *str); +PHPAPI php_url *php_url_parse_ex(char const *str, int length); PHPAPI int php_url_decode(char *str, int len); /* return value: length of decoded string */ PHPAPI int php_raw_url_decode(char *str, int len); /* return value: length of decoded string */ PHPAPI char *php_url_encode(char *s, int len, int *new_length);

« previous php.cvs (#28731) next »