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

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to