Skip to content

Commit a24811d

Browse files
committed
Refactor spl_filesystem_object_get_path() to return zend_string*
1 parent 5215292 commit a24811d

File tree

3 files changed

+64
-75
lines changed

3 files changed

+64
-75
lines changed

ext/phar/phar_object.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -1448,9 +1448,10 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
14481448
}
14491449

14501450
switch (intern->type) {
1451-
case SPL_FS_DIR:
1452-
test = spl_filesystem_object_get_path(intern, NULL);
1453-
fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name);
1451+
case SPL_FS_DIR: {
1452+
zend_string *test_str = spl_filesystem_object_get_path(intern);
1453+
fname_len = spprintf(&fname, 0, "%s%c%s", ZSTR_VAL(test_str), DEFAULT_SLASH, intern->u.dir.entry.d_name);
1454+
zend_string_release_ex(test_str, /* persistent */ false);
14541455
if (php_stream_stat_path(fname, &ssb) == 0 && S_ISDIR(ssb.sb.st_mode)) {
14551456
/* ignore directories */
14561457
efree(fname);
@@ -1470,6 +1471,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
14701471

14711472
save = fname;
14721473
goto phar_spl_fileinfo;
1474+
}
14731475
case SPL_FS_INFO:
14741476
case SPL_FS_FILE:
14751477
fname = expand_filepath(ZSTR_VAL(intern->file_name), NULL);

ext/spl/spl_directory.c

+58-71
Original file line numberDiff line numberDiff line change
@@ -222,19 +222,22 @@ static zend_object *spl_filesystem_object_new_check(zend_class_entry *class_type
222222
}
223223
/* }}} */
224224

225-
PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_t *len) /* {{{ */
225+
PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern) /* {{{ */
226226
{
227227
#ifdef HAVE_GLOB
228-
if (intern->type == SPL_FS_DIR) {
229-
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
230-
return php_glob_stream_get_path(intern->u.dir.dirp, len);
228+
if (intern->type == SPL_FS_DIR && php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) {
229+
size_t len = 0;
230+
char *tmp = php_glob_stream_get_path(intern->u.dir.dirp, &len);
231+
if (len == 0) {
232+
return NULL;
231233
}
234+
return zend_string_init(tmp, len, /* persistent */ false);
232235
}
233236
#endif
234-
if (len) {
235-
*len = intern->path ? ZSTR_LEN(intern->path) : 0;
237+
if (!intern->path) {
238+
return NULL;
236239
}
237-
return intern->path ? ZSTR_VAL(intern->path) : NULL;
240+
return zend_string_copy(intern->path);
238241
} /* }}} */
239242

240243
static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */
@@ -249,29 +252,25 @@ static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_obj
249252
case SPL_FS_FILE:
250253
zend_throw_error(NULL, "Object not initialized");
251254
return FAILURE;
252-
break;
253-
case SPL_FS_DIR:
254-
{
255-
size_t name_len;
256-
size_t path_len = 0;
257-
char *path;
258-
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
259-
260-
path = spl_filesystem_object_get_path(intern, &path_len);
261-
/* if there is parent path, amend it, otherwise just use the given path as is */
262-
name_len = strlen(intern->u.dir.entry.d_name);
263-
if (path_len == 0) {
264-
intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
265-
} else {
266-
zend_string *file_name = zend_string_alloc(path_len + 1 + name_len, 0);
267-
memcpy(ZSTR_VAL(file_name), path, path_len);
268-
ZSTR_VAL(file_name)[path_len] = slash;
269-
memcpy(ZSTR_VAL(file_name) + path_len + 1, intern->u.dir.entry.d_name, name_len);
270-
ZSTR_VAL(file_name)[path_len + 1 + name_len] = 0;
271-
intern->file_name = file_name;
272-
}
255+
case SPL_FS_DIR: {
256+
size_t name_len;
257+
zend_string *path;
258+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
259+
260+
path = spl_filesystem_object_get_path(intern);
261+
/* if there is parent path, amend it, otherwise just use the given path as is */
262+
name_len = strlen(intern->u.dir.entry.d_name);
263+
if (!path) {
264+
intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
265+
return SUCCESS;
273266
}
267+
268+
ZEND_ASSERT(ZSTR_LEN(path) != 0);
269+
intern->file_name = zend_string_concat3(
270+
ZSTR_VAL(path), ZSTR_LEN(path), &slash, 1, intern->u.dir.entry.d_name, name_len);
271+
zend_string_release_ex(path, /* persistent */ false);
274272
break;
273+
}
275274
}
276275
return SUCCESS;
277276
} /* }}} */
@@ -545,16 +544,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
545544
zend_call_method_with_1_params(Z_OBJ_P(return_value), ce, &ce->constructor, "__construct", NULL, &arg1);
546545
zval_ptr_dtor(&arg1);
547546
} else {
548-
char *path;
549-
size_t path_len;
550-
551547
intern->file_name = zend_string_copy(source->file_name);
552-
path = spl_filesystem_object_get_path(source, &path_len);
553-
if (source->path && ZSTR_VAL(source->path) == path) {
554-
intern->path = zend_string_copy(source->path);
555-
} else {
556-
intern->path = zend_string_init(path, path_len, 0);
557-
}
548+
intern->path = spl_filesystem_object_get_path(source);
558549
}
559550
break;
560551
case SPL_FS_FILE:
@@ -584,17 +575,8 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
584575
zval_ptr_dtor(&arg1);
585576
zval_ptr_dtor(&arg2);
586577
} else {
587-
char *path;
588-
size_t path_len;
589-
590578
intern->file_name = source->file_name;
591-
path = spl_filesystem_object_get_path(source, &path_len);
592-
if (source->path && ZSTR_VAL(source->path) == path) {
593-
intern->path = zend_string_copy(source->path);
594-
} else {
595-
intern->path = zend_string_init(path, path_len, 0);
596-
}
597-
579+
intern->path = spl_filesystem_object_get_path(source);
598580
intern->u.file.open_mode = zend_string_copy(open_mode);
599581
intern->u.file.zcontext = resource;
600582

@@ -664,18 +646,19 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
664646
zend_string_release_ex(pnstr, 0);
665647

666648
if (intern->file_name) {
667-
size_t path_len;
649+
zend_string *path;
668650

669651
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1);
670-
spl_filesystem_object_get_path(intern, &path_len);
652+
path = spl_filesystem_object_get_path(intern);
671653

672-
if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
673-
ZVAL_STRINGL(&tmp, ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1));
654+
if (ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
655+
ZVAL_STRINGL(&tmp, ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1, ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1));
674656
} else {
675657
ZVAL_STR_COPY(&tmp, intern->file_name);
676658
}
677659
zend_symtable_update(rv, pnstr, &tmp);
678-
zend_string_release_ex(pnstr, 0);
660+
zend_string_release_ex(pnstr, /* persistent */ false);
661+
zend_string_release_ex(path, /* persistent */ false);
679662
}
680663
if (intern->type == SPL_FS_DIR) {
681664
#ifdef HAVE_GLOB
@@ -905,16 +888,15 @@ PHP_METHOD(DirectoryIterator, valid)
905888
PHP_METHOD(SplFileInfo, getPath)
906889
{
907890
spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
908-
char *path;
909-
size_t path_len;
891+
zend_string *path;
910892

911893
if (zend_parse_parameters_none() == FAILURE) {
912894
RETURN_THROWS();
913895
}
914896

915-
path = spl_filesystem_object_get_path(intern, &path_len);
897+
path = spl_filesystem_object_get_path(intern);
916898
if (path) {
917-
RETURN_STRINGL(path, path_len);
899+
RETURN_STR(path);
918900
} else {
919901
RETURN_EMPTY_STRING();
920902
}
@@ -925,7 +907,7 @@ PHP_METHOD(SplFileInfo, getPath)
925907
PHP_METHOD(SplFileInfo, getFilename)
926908
{
927909
spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
928-
size_t path_len;
910+
zend_string *path;
929911

930912
if (zend_parse_parameters_none() == FAILURE) {
931913
RETURN_THROWS();
@@ -936,13 +918,15 @@ PHP_METHOD(SplFileInfo, getFilename)
936918
RETURN_THROWS();
937919
}
938920

939-
spl_filesystem_object_get_path(intern, &path_len);
921+
path = spl_filesystem_object_get_path(intern);
940922

941-
if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
942-
RETURN_STRINGL(ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1));
923+
if (path && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
924+
size_t path_len = ZSTR_LEN(path);
925+
RETVAL_STRINGL(ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1));
943926
} else {
944-
RETURN_STR_COPY(intern->file_name);
927+
RETVAL_STR_COPY(intern->file_name);
945928
}
929+
zend_string_release_ex(path, /* persistent */ false);
946930
}
947931
/* }}} */
948932

@@ -967,7 +951,7 @@ PHP_METHOD(SplFileInfo, getExtension)
967951
char *fname = NULL;
968952
const char *p;
969953
size_t flen;
970-
size_t path_len;
954+
zend_string *path;
971955
size_t idx;
972956
zend_string *ret;
973957

@@ -980,15 +964,16 @@ PHP_METHOD(SplFileInfo, getExtension)
980964
RETURN_THROWS();
981965
}
982966

983-
spl_filesystem_object_get_path(intern, &path_len);
967+
path = spl_filesystem_object_get_path(intern);
984968

985-
if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
986-
fname = ZSTR_VAL(intern->file_name) + path_len + 1;
987-
flen = ZSTR_LEN(intern->file_name) - (path_len + 1);
969+
if (ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
970+
fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1;
971+
flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1);
988972
} else {
989973
fname = ZSTR_VAL(intern->file_name);
990974
flen = ZSTR_LEN(intern->file_name);
991975
}
976+
zend_string_release_ex(path, /* persistent */ false);
992977

993978
ret = php_basename(fname, flen, NULL, 0);
994979

@@ -1038,7 +1023,8 @@ PHP_METHOD(SplFileInfo, getBasename)
10381023
spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
10391024
char *fname, *suffix = 0;
10401025
size_t flen;
1041-
size_t slen = 0, path_len;
1026+
size_t slen = 0;
1027+
zend_string *path;
10421028

10431029
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &suffix, &slen) == FAILURE) {
10441030
RETURN_THROWS();
@@ -1049,15 +1035,16 @@ PHP_METHOD(SplFileInfo, getBasename)
10491035
RETURN_THROWS();
10501036
}
10511037

1052-
spl_filesystem_object_get_path(intern, &path_len);
1038+
path = spl_filesystem_object_get_path(intern);
10531039

1054-
if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
1055-
fname = ZSTR_VAL(intern->file_name) + path_len + 1;
1056-
flen = ZSTR_LEN(intern->file_name) - (path_len + 1);
1040+
if (path && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
1041+
fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1;
1042+
flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1);
10571043
} else {
10581044
fname = ZSTR_VAL(intern->file_name);
10591045
flen = ZSTR_LEN(intern->file_name);
10601046
}
1047+
zend_string_release_ex(path, /* persistent */ false);
10611048

10621049
RETURN_STR(php_basename(fname, flen, suffix, slen));
10631050
}

ext/spl/spl_directory.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ typedef struct _spl_filesystem_object spl_filesystem_object;
3636
typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object);
3737
typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst);
3838

39-
PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_t *len);
39+
PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern);
4040

4141
typedef struct _spl_other_handler {
4242
spl_foreign_dtor_t dtor;

0 commit comments

Comments
 (0)