Stuck debugging a PHP6 string-->unicode-->string conversion problem on Solaris (SPARC)
| From: | Arvind Srinivasan | Date: | Fri, 13 Nov 2009 13:44:10 +0000 |
| Subject: | Stuck debugging a PHP6 string-->unicode-->string conversion problem on Solaris (SPARC) | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-46040@lists.php.net to get a copy of this message | ||
Hi,
I need some help debugging a test failure
(./ext/spl/tests/DirectoryIterator_getBasename_basic_test goes into an
infinite loop) on Solaris 10 (SPARC) with PHP6 trunk.
I've narrowed the problem down to a difference between what
zspprintf() converts to unicode and is then subsequently converted to
string by zend_unicode_to_string_ex().
spl_filesystem_object_get_file_name creates a unicoded pathname (to an
entry in a directory) by invoking zspprintf:
intern->file_name_len = zspprintf(path_type, &intern->file_name, 0,
"%R%c%s", path_type, path.v, slash, intern->u.dir.entry.d_name);
php_u_stat on intern->file_name ends up calling
num_conv = zend_unicode_to_string_ex(ZEND_U_CONVERTER(UG(filesystem_encoding_conv)),
pathenc, pathenc_len, path, path_len, &status);
in main/streams/streams.c
After this call, pathenc contains garbage characters in place of what
was written into intern->file_name by zspprint for %c%s. Whatever was
written in as %R comes out correctly in pathenc.
As a test, I tried the following:
intern->file_name_len = zspprintf(path_type, &intern->file_name, 0, "/tmp/.");
zend_unicode_to_string_ex(ZEND_U_CONVERTER(UG(filesystem_encoding_conv)),
&pathenc, pathenc_len, intern->file_name.u, intern->file_name_len,
&status);
Here's my debugger session which shows that I don't get back the
string '/tmp/.' from zend_unicode_to_string_ex.
(dbx 9) list 204,208
204 intern->file_name_len =
zspprintf(path_type, &intern->file_name, 0, "/tmp/.");
205
206
zend_unicode_to_string_ex(ZEND_U_CONVERTER(UG(filesystem_encoding_conv)),
207 &pathenc, pathenc_len,
intern->file_name.u, intern->file_name_len, &status);
(dbx 10) n
t@1 (l@1) stopped in spl_filesystem_object_get_file_name at line 207
in file "spl_directory.c"
207 &pathenc, pathenc_len,
intern->file_name.u, intern->file_name_len, &status);
(dbx 11) print intern->file_name_len
intern->file_name_len = 6
(dbx 12) examine intern->file_name.v/12c
0x00fd4b88: '/' '\0' 't' '\0' 'm'
'\0' 'p' '\0' '/' '\0' '.'
'\0'
(dbx 13) n
t@1 (l@1) stopped in spl_filesystem_object_get_file_name at line 213
in file "spl_directory.c"
213 intern->file_name_type = path_type;
(dbx 14) print status
status = U_ZERO_ERROR
(dbx 15) print *pathenc_len
*pathenc_len = 18
(dbx 16) x pathenc/18c
0x00fd3860: '�' '�' '�' '�' '�'
'�' '�' '�' '�' '�' '�'
'�' '�' '�' '�' '�'
0x00fd3870: '�' '�'
(dbx 17) p pathenc
pathenc = 0xfd3860
"\xe2\xbc\x80\xe7\x90\x80\xe6\xb4\x80\xe7\x80\x80\xe2\xbc\x80\xe2\xb8\x80"
How should I proceed?
Thanks,
Arvi