No MFH? Bug still open? What's the deal here? --Jani On Wed, 10 Dec 2003, Moriyoshi Koizumi wrote:
>moriyoshi Wed Dec 10 02:15:29 2003 EDT > > Modified files: > /php-src/ext/standard ftp_fopen_wrapper.c php_string.h string.c > Log: > Fix bug #26574 (basename() doesn't work properly with multibyte characters) > > >Index: php-src/ext/standard/ftp_fopen_wrapper.c >diff -u php-src/ext/standard/ftp_fopen_wrapper.c:1.66 >php-src/ext/standard/ftp_fopen_wrapper.c:1.67 >--- php-src/ext/standard/ftp_fopen_wrapper.c:1.66 Sat Nov 29 15:01:00 2003 >+++ php-src/ext/standard/ftp_fopen_wrapper.c Wed Dec 10 02:15:28 2003 >@@ -18,7 +18,7 @@ > | Sara Golemon <[EMAIL PROTECTED]> | > +----------------------------------------------------------------------+ > */ >-/* $Id: ftp_fopen_wrapper.c,v 1.66 2003/11/29 20:01:00 pollita Exp $ */ >+/* $Id: ftp_fopen_wrapper.c,v 1.67 2003/12/10 07:15:28 moriyoshi Exp $ */ > > #include "php.h" > #include "php_globals.h" >@@ -562,7 +562,7 @@ > php_stream *innerstream = (php_stream *)stream->abstract; > size_t tmp_len; > char *basename; >- int basename_len; >+ size_t basename_len; > > if (count != sizeof(php_stream_dirent)) { > return 0; >@@ -586,8 +586,9 @@ > return 0; > } > >- memcpy(ent->d_name, basename, MIN((int)sizeof(ent->d_name), basename_len)-1); >- ent->d_name[sizeof(ent->d_name)-1] = '\0'; >+ tmp_len = MIN(sizeof(ent->d_name), basename_len) - 1; >+ memcpy(ent->d_name, basename, tmp_len); >+ ent->d_name[tmp_len] = '\0'; > efree(basename); > > return sizeof(php_stream_dirent); >Index: php-src/ext/standard/php_string.h >diff -u php-src/ext/standard/php_string.h:1.81 php-src/ext/standard/php_string.h:1.82 >--- php-src/ext/standard/php_string.h:1.81 Wed Dec 10 01:08:39 2003 >+++ php-src/ext/standard/php_string.h Wed Dec 10 02:15:28 2003 >@@ -17,7 +17,7 @@ > +----------------------------------------------------------------------+ > */ > >-/* $Id: php_string.h,v 1.81 2003/12/10 06:08:39 moriyoshi Exp $ */ >+/* $Id: php_string.h,v 1.82 2003/12/10 07:15:28 moriyoshi Exp $ */ > > /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */ > >@@ -122,7 +122,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 void php_basename(char *str, size_t len , char *suffix, size_t sufflen, char >**p_ret, int *p_len); >+PHPAPI void php_basename(char *str, size_t len , char *suffix, size_t sufflen, char >**p_ret, size_t *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: php-src/ext/standard/string.c >diff -u php-src/ext/standard/string.c:1.405 php-src/ext/standard/string.c:1.406 >--- php-src/ext/standard/string.c:1.405 Wed Dec 10 01:04:15 2003 >+++ php-src/ext/standard/string.c Wed Dec 10 02:15:28 2003 >@@ -18,7 +18,7 @@ > +----------------------------------------------------------------------+ > */ > >-/* $Id: string.c,v 1.405 2003/12/10 06:04:15 moriyoshi Exp $ */ >+/* $Id: string.c,v 1.406 2003/12/10 07:15:28 moriyoshi Exp $ */ > > /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ > >@@ -1068,56 +1068,69 @@ > > /* {{{ php_basename > */ >-PHPAPI void php_basename(char *s, size_t len, char *suffix, size_t sufflen, char >**p_ret, int *p_len) >+PHPAPI void php_basename(char *s, size_t len, char *suffix, size_t sufflen, char >**p_ret, size_t *p_len) > { >- char *ret=NULL, *c; >- c = s + len - 1; >- >- /* strip trailing slashes */ >- while (*c == '/' >+ char *ret = NULL, *c, *comp, *cend; >+ size_t inc_len, cnt; >+ int state; >+ >+ c = comp = cend = s; >+ cnt = len; >+ state = 0; >+ while (cnt > 0) { >+ inc_len = (*c == '\0' ? 1: php_mblen(c, cnt)); >+ >+ switch (inc_len) { >+ case -2: >+ case -1: >+ inc_len = 1; >+ php_mblen(NULL, 0); >+ break; >+ case 0: >+ goto quit_loop; >+ case 1: > #ifdef PHP_WIN32 >- || (*c == '\\' && !IsDBCSLeadByte(*(c-1))) >+ if (*c == '/' || *c == '\\') { >+#else >+ if (*c == '/') { > #endif >- ) { >- c--; >- len--; >+ if (state == 1) { >+ state = 0; >+ cend = c; >+ } >+ } else { >+ if (state == 0) { >+ comp = c; >+ state = 1; >+ } >+ } >+ default: >+ break; >+ } >+ c += inc_len; >+ cnt -= inc_len; > } > >- /* 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-sufflen) != '\\' || IsDBCSLeadByte(*(c-sufflen-1))) >-#endif >- ) { >- c -= sufflen; >- len -= sufflen; >- } >- } >+quit_loop: >+ if (state == 1) { >+ cend = c; > } >- >- while(c>=s) { >- if(*c == '/' >-#ifdef PHP_WIN32 >- || ( *c == '\\' && !IsDBCSLeadByte(*(c-1))) >-#endif >- ) { >- c++; >- break; >- } >- c--; >+ if (suffix != NULL && sufflen < (cend - comp) && >+ memcmp(cend - sufflen, suffix, sufflen) == 0) { >+ cend -= sufflen; > } > >- if (c<s) c=s; >- >- len -= (c-s); >- ret = emalloc(len+1); >- memcpy(ret, c, len); >+ len = cend - comp; >+ ret = emalloc(len + 1); >+ memcpy(ret, comp, len); > ret[len] = '\0'; > >- if(p_ret) *p_ret = ret; >- if(p_len) *p_len = len; >+ if (p_ret) { >+ *p_ret = ret; >+ } >+ if (p_len) { >+ *p_len = len; >+ } > } > /* }}} */ > >@@ -1126,14 +1139,15 @@ > PHP_FUNCTION(basename) > { > char *string, *suffix = NULL, *ret; >- int string_len, suffix_len = 0, ret_len; >+ int string_len, suffix_len = 0; >+ size_t ret_len; > > if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &string, > &string_len, &suffix, &suffix_len) == FAILURE) { > return; > } > >- php_basename(string, string_len, suffix, suffix_len, &ret, &ret_len); >- RETURN_STRINGL(ret, ret_len, 0); >+ php_basename(string, string_len, suffix, suffix_len, &ret, &ret_len); >+ RETURN_STRINGL(ret, (int)ret_len, 0); > } > /* }}} */ > >@@ -1230,7 +1244,8 @@ > { > zval *tmp; > char *path, *ret = NULL; >- int path_len, ret_len; >+ int path_len; >+ size_t ret_len; > long opt = PHP_PATHINFO_ALL; > > if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, > &opt) == FAILURE) { > > -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php