Skip to content

Commit

Permalink
Fix erroneous assertions
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
cmb69 committed May 9, 2019
1 parent 35c8058 commit 27f168c
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions win32/codepage.c
Expand Up @@ -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';

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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';

Expand Down

0 comments on commit 27f168c

Please sign in to comment.