cvs: php4 / TODO /ext/exif exif.c /ext/standard ftp_fopen_wrapper.c php_string.h string.c /ext/standard/tests/strings basename.phpt

From: Date: Mon, 05 May 2003 13:46:15 +0000
Subject: cvs: php4 / TODO /ext/exif exif.c /ext/standard ftp_fopen_wrapper.c php_string.h string.c /ext/standard/tests/strings basename.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-20707@lists.php.net to get a copy of this message
hholzgra Mon May 5 09:46:15 2003 EDT Added files: /php4/ext/standard/tests/strings basename.phpt Modified files: /php4 TODO /php4/ext/standard ftp_fopen_wrapper.c php_string.h string.c /php4/ext/exif exif.c Log: basename() now binary safe, testcases added

Index: php4/TODO diff -u php4/TODO:1.145 php4/TODO:1.146 --- php4/TODO:1.145 Thu Apr 17 17:04:47 2003 +++ php4/TODO Mon May 5 09:46:14 2003 @@ -136,8 +136,6 @@ variable name is seen more than once. * Implement regex-cache for url-functions. * Move socket related functions to fsock.c. - * NOT binary safe: - basename() ext/wddx -------- Index: php4/ext/standard/ftp_fopen_wrapper.c diff -u php4/ext/standard/ftp_fopen_wrapper.c:1.52 php4/ext/standard/ftp_fopen_wrapper.c:1.53 --- php4/ext/standard/ftp_fopen_wrapper.c:1.52 Fri Apr 25 21:55:31 2003 +++ php4/ext/standard/ftp_fopen_wrapper.c Mon May 5 09:46:14 2003 @@ -17,7 +17,7 @@ | Hartmut Holzgraefe <hholzgra@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: ftp_fopen_wrapper.c,v 1.52 2003/04/26 01:55:31 pollita Exp $ */ +/* $Id: ftp_fopen_wrapper.c,v 1.53 2003/05/05 13:46:14 hholzgra Exp $ */ #include "php.h" #include "php_globals.h" @@ -552,6 +552,7 @@ php_stream *innerstream = (php_stream *)stream->abstract; size_t tmp_len; char *basename; + int basename_len; if (count != sizeof(php_stream_dirent)) { return 0; @@ -564,15 +565,19 @@ if (!php_stream_get_line(innerstream, ent->d_name, sizeof(ent->d_name), &tmp_len)) { return 0; } - if (!(basename = php_basename(ent->d_name, tmp_len, NULL, 0))) { + + php_basename(ent->d_name, tmp_len, NULL, 0, &basename, &basename_len); + if (!basename) { return 0; } - if (strlen(basename) == 0) { + if (!basename_len) { efree(basename); return 0; } - strcpy(ent->d_name, basename); + + memcpy(ent->d_name, basename, MIN(sizeof(ent->d_name), basename_len)-1); + ent->d_name[sizeof(ent->d_name)-1] = '\0'; efree(basename); return sizeof(php_stream_dirent); Index: php4/ext/standard/php_string.h diff -u php4/ext/standard/php_string.h:1.76 php4/ext/standard/php_string.h:1.77 --- php4/ext/standard/php_string.h:1.76 Sun Apr 13 18:59:19 2003 +++ php4/ext/standard/php_string.h Mon May 5 09:46:14 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_string.h,v 1.76 2003/04/13 22:59:19 pollita Exp $ */ +/* $Id: php_string.h,v 1.77 2003/05/05 13:46:14 hholzgra Exp $ */ /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */ @@ -121,7 +121,7 @@ PHPAPI char *php_addcslashes(char *str, int length, int *new_length, int freeit, char *what, int wlength TSRMLS_DC); PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC); PHPAPI void php_stripcslashes(char *str, int *len); -PHPAPI char *php_basename(char *str, size_t len , char *suffix, size_t sufflen); +PHPAPI void php_basename(char *str, size_t len , char *suffix, size_t sufflen, char **p_ret, int *p_len); PHPAPI size_t php_dirname(char *str, size_t len); PHPAPI char *php_stristr(unsigned char *s, unsigned char *t, size_t s_len, size_t t_len); PHPAPI char *php_str_to_str_ex(char *haystack, int length, char *needle, Index: php4/ext/standard/string.c diff -u php4/ext/standard/string.c:1.379 php4/ext/standard/string.c:1.380 --- php4/ext/standard/string.c:1.379 Sun May 4 08:44:35 2003 +++ php4/ext/standard/string.c Mon May 5 09:46:14 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.379 2003/05/04 12:44:35 moriyoshi Exp $ */ +/* $Id: string.c,v 1.380 2003/05/05 13:46:14 hholzgra Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -1074,21 +1074,11 @@ /* {{{ php_basename */ -PHPAPI char *php_basename(char *s, size_t len, char *suffix, size_t sufflen) +PHPAPI void php_basename(char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, int *p_len) { - char *ret=NULL, *c, *p=NULL, buf='\0', *p2=NULL, buf2='\0'; + char *ret=NULL, *c; c = s + len - 1; - /* do suffix removal as the unix command does */ - if (suffix && (len > sufflen)) { - if (!strncmp(suffix, c-sufflen+1, sufflen)) { - c -= sufflen; - buf2 = *(c + 1); /* Save overwritten char */ - *(c + 1) = '\0'; /* overwrite char */ - p2 = c + 1; /* Save pointer to overwritten char */ - } - } - /* strip trailing slashes */ while (*c == '/' #ifdef PHP_WIN32 @@ -1096,30 +1086,44 @@ #endif ) { c--; + len--; } - if (c < s+len-1) { - buf = *(c + 1); /* Save overwritten char */ - *(c + 1) = '\0'; /* overwrite char */ - p = c + 1; /* Save pointer to overwritten char */ - } - - if ((c = strrchr(s, '/')) + /* do suffix removal as the unix command does */ + if (suffix && (len > sufflen)) { + if (!memcmp(suffix, c-sufflen+1, sufflen)) { + if( (*(c-sufflen) != '/') #ifdef PHP_WIN32 - || ((c = strrchr(s, '\\')) && !IsDBCSLeadByte(*(c-1))) -#endif - ) { - ret = estrdup(c + 1); - } else { - ret = estrdup(s); - } - if (buf) { - *p = buf; + && ( *(c-sufflen) != '\\' || IsDBCSLeadByte(*(c-sufflen-1))) +#endif + ) { + c -= sufflen; + len -= sufflen; + } + } } - if (buf2) { - *p2 = buf2; + + while(c>=s) { + if(*c == '/' +#ifdef PHP_WIN32 + || ( *c == '\\' && !IsDBCSLeadByte(*c-1)) +#endif + ) { + c++; + break; + } + c--; } - return (ret); + + if (c<s) c=s; + + len -= (c-s); + ret = emalloc(len+1); + memcpy(ret, c, len); + ret[len] = '\0'; + + if(p_ret) *p_ret = ret; + if(p_len) *p_len = len; } /* }}} */ @@ -1127,16 +1131,15 @@ Returns the filename component of the path */ PHP_FUNCTION(basename) { - char *ret; - char *string, *suffix = NULL; - int string_len, suffix_len = 0; + char *string, *suffix = NULL, *ret; + int string_len, suffix_len = 0, ret_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &string, &string_len, &suffix, &suffix_len) == FAILURE) { return; } - ret = php_basename(string, string_len, suffix, suffix_len); - RETURN_STRING(ret, 0); + php_basename(string, string_len, suffix, suffix_len, &ret, &ret_len); + RETURN_STRINGL(ret, ret_len, 0); } /* }}} */ @@ -1233,7 +1236,7 @@ { zval *tmp; char *path, *ret = NULL; - int path_len; + int path_len, ret_len; long opt = PHP_PATHINFO_ALL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) { @@ -1253,8 +1256,8 @@ } if ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME) { - ret = php_basename(path, path_len, NULL, 0); - add_assoc_string(tmp, "basename", ret, 0); + php_basename(path, path_len, NULL, 0, &ret, &ret_len); + add_assoc_stringl(tmp, "basename", ret, ret_len, 0); } if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) { @@ -1265,10 +1268,8 @@ /* Have we alrady looked up the basename? */ if (!have_basename) { - ret = php_basename(path, path_len, NULL, 0); + php_basename(path, path_len, NULL, 0, &ret, &ret_len); } - - ret_len = strlen(ret); p = strrchr(ret, '.'); Index: php4/ext/exif/exif.c diff -u php4/ext/exif/exif.c:1.145 php4/ext/exif/exif.c:1.146 --- php4/ext/exif/exif.c:1.145 Wed Apr 16 02:10:41 2003 +++ php4/ext/exif/exif.c Mon May 5 09:46:14 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: exif.c,v 1.145 2003/04/16 06:10:41 helly Exp $ */ +/* $Id: exif.c,v 1.146 2003/05/05 13:46:14 hholzgra Exp $ */ /* ToDos * @@ -99,7 +99,7 @@ }; /* }}} */ -#define EXIF_VERSION "1.4 $Id: exif.c,v 1.145 2003/04/16 06:10:41 helly Exp $" +#define EXIF_VERSION "1.4 $Id: exif.c,v 1.146 2003/05/05 13:46:14 hholzgra Exp $" /* {{{ PHP_MINFO_FUNCTION */ @@ -3687,7 +3687,7 @@ return FALSE; } - ImageInfo->FileName = php_basename(FileName, strlen(FileName), NULL, 0); + php_basename(FileName, strlen(FileName), NULL, 0, &(ImageInfo->FileName), NULL); ImageInfo->read_thumbnail = read_thumbnail; ImageInfo->read_all = read_all; ImageInfo->Thumbnail.filetype = IMAGE_FILETYPE_UNKNOWN; Index: php4/ext/standard/tests/strings/basename.phpt +++ php4/ext/standard/tests/strings/basename.phpt --TEST-- basename() function --POST-- --GET-- --FILE-- <?php // simple checks var_dump(basename("bar")); var_dump(basename("/foo/bar")); var_dump(basename("/bar")); // simple checks with trailing slashes var_dump(basename("bar/")); var_dump(basename("/foo/bar/")); var_dump(basename("/bar/")); // suffix removal checks var_dump(basename("bar.gz", ".gz")); var_dump(basename("/foo/bar.gz", ".gz")); var_dump(basename("/bar.gz", ".gz")); // suffix removal checks with trailing slashes var_dump(basename("bar.gz/", ".gz")); var_dump(basename("/foo/bar.gz/", ".gz")); var_dump(basename("/bar.gz/", ".gz")); // suffix removal checks var_dump(basename("/.gz", ".gz")); var_dump(basename("/foo/.gz", ".gz")); var_dump(basename("/.gz", ".gz")); // binary safe? var_dump(basename("foo".chr(0)."bar")); var_dump(basename("foo".chr(0)."bar.gz", ".gz")); ?> --EXPECT-- string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" string(3) ".gz" string(3) ".gz" string(3) ".gz" string(7) "foobar" string(7) "foobar"
« previous php.cvs (#20707) next »