]> granicus.if.org Git - php/commitdiff
Fix erroneous assertions
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 9 May 2019 14:54:11 +0000 (16:54 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 9 May 2019 14:54:11 +0000 (16:54 +0200)
Since PHP strings are binary safe (i.e. they may contain NUL bytes), we
must not assume that strlen()/wcslen() actually return the length of
the string.  Only if the given in_len is zero, it is safe to assert
this.

win32/codepage.c

index 25cd4d786f4eacb9905c6e28b94c4af9e28ea910..86b7179c3e7868ebee0a3d83f1cae51feed6ae00 100644 (file)
@@ -63,7 +63,7 @@ __forceinline static wchar_t *php_win32_cp_to_w_int(const char* in, size_t in_le
        }
 
        assert(ret ? tmp_len == ret_len : 1);
-       assert(ret ? wcslen(ret) == ret_len - 1 : 1);
+       assert(ret && !in_len ? wcslen(ret) == ret_len - 1 : 1);
 
        ret[ret_len-1] = L'\0';
 
@@ -97,7 +97,10 @@ PW32CP wchar_t *php_win32_cp_conv_ascii_to_w(const char* in, size_t in_len, size
 {/*{{{*/
        wchar_t *ret = NULL;
        const char *idx = in, *end;
-
+#if PHP_DEBUG
+       size_t save_in_len = in_len;
+#endif
        assert(in && in_len ? in[in_len] == '\0' : 1);
 
        if (!in) {
@@ -154,7 +157,7 @@ PW32CP wchar_t *php_win32_cp_conv_ascii_to_w(const char* in, size_t in_len, size
                } while (i < in_len);
                ret[in_len] = L'\0';
 
-               assert(ret ? wcslen(ret) == in_len : 1);
+               assert(ret && !save_in_len ? wcslen(ret) == in_len : 1);
 
                if (PHP_WIN32_CP_IGNORE_LEN_P != out_len) {
                        *out_len = in_len;
@@ -202,7 +205,7 @@ __forceinline static char *php_win32_cp_from_w_int(const wchar_t* in, size_t in_
        }
 
        assert(target ? r == target_len : 1);
-       assert(target ? strlen(target) == target_len - 1 : 1);
+       assert(target && !in_len ? strlen(target) == target_len - 1 : 1);
 
        target[target_len-1] = '\0';