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

Reply via email to