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