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 <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $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 <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $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);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php