From bb21c4073827a42088bc2f3b3806f075f9a43a04 Mon Sep 17 00:00:00 2001 From: Rui Hirokawa Date: Wed, 3 Jul 2002 13:36:19 +0000 Subject: [PATCH] fixed shift_jis character corruption including 0x5c as second byte on uploaded filename. --- ext/mbstring/mbstring.c | 21 +++++++++++++++++++++ ext/mbstring/mbstring.h | 2 ++ main/rfc1867.c | 7 +++++++ 3 files changed, 30 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 90d8a9d8c8..ae43455e7d 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1323,6 +1323,27 @@ SAPI_POST_HANDLER_FUNC(php_mbstr_post_handler) } #endif + +#define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0) +#define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0) + +char *mbstr_strrchr(const char *s, char c){ + unsigned char *p = (unsigned char *)s, *last = NULL; + while(*p++) { + if (*p == c) { + last = p; + } + if (*p == '\0'){ + break; + } + if (MBSTRG(current_language) == mbfl_no_language_japanese + && IS_SJIS1(*p) && IS_SJIS2(*(p+1))) { + p++; + } + } + return last; +} + /* http input processing */ void mbstr_treat_data(int arg, char *str, zval* destArray TSRMLS_DC) { diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 98623e77b4..91175f8421 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -124,6 +124,8 @@ PHP_FUNCTION(mb_ereg_search_setpos); int php_mbregex_name2mbctype(const char *pname); #endif +char *mbstr_strrchr(const char *s, char c); + ZEND_BEGIN_MODULE_GLOBALS(mbstring) int language; int current_language; diff --git a/main/rfc1867.c b/main/rfc1867.c index 549ffa4d76..a5984830ed 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -32,6 +32,9 @@ #include "php_variables.h" #include "rfc1867.h" +#if HAVE_MBSTRING +#include "ext/mbstring/mbstring.h" +#endif #undef DEBUG_FILE_UPLOAD @@ -823,7 +826,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) sprintf(lbuf, "%s_name", param); } +#if HAVE_MBSTRING + s = mbstr_strrchr(filename, '\\'); +#else s = strrchr(filename, '\\'); +#endif if (s && s > filename) { safe_php_register_variable(lbuf, s+1, NULL, 0 TSRMLS_CC); } else { -- 2.40.0