Skip to content

Commit 251a774

Browse files
committed
ext/phar: use zend_string for alias arg of phar_open_from_fp()
Required removing some const qualifiers on zend_string* and propagate the change to simplify the code.
1 parent a98a3e2 commit 251a774

4 files changed

Lines changed: 58 additions & 35 deletions

File tree

ext/phar/phar.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,7 @@ check_file:;
13731373
return phar_create_or_parse_filename(fname, alias, is_data, options, pphar, error);
13741374
}
13751375

1376-
static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
1376+
static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error);
13771377

13781378
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(
13791379
zend_string *fname,
@@ -1399,10 +1399,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(
13991399
fname = actual;
14001400
}
14011401

1402-
const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL;
1403-
size_t alias_len = alias ? ZSTR_LEN(alias) : 0;
14041402
if (fp) {
1405-
if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, options, pphar, error) == SUCCESS) {
1403+
if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, options, pphar, error) == SUCCESS) {
14061404
if ((*pphar)->is_data || !PHAR_G(readonly)) {
14071405
(*pphar)->is_writeable = 1;
14081406
}
@@ -1520,8 +1518,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(
15201518
* that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS
15211519
* or FAILURE is returned and pphar is set to a pointer to the phar's manifest
15221520
*/
1523-
zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
1524-
{
1521+
zend_result phar_open_from_filename(
1522+
char *fname,
1523+
size_t fname_len,
1524+
/* copyable & hash update */ zend_string *alias,
1525+
uint32_t options,
1526+
phar_archive_data** pphar,
1527+
char **error
1528+
) {
15251529
php_stream *fp;
15261530
zend_string *actual;
15271531
bool is_data = false;
@@ -1564,23 +1568,29 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_st
15641568
fname_len = ZSTR_LEN(actual);
15651569
}
15661570

1567-
zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias_cstr, alias_len, options, pphar, error);
1571+
zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias, options, pphar, error);
15681572

15691573
if (actual) {
15701574
zend_string_release_ex(actual, 0);
15711575
}
15721576

15731577
return ret;
15741578
}
1575-
/* }}}*/
15761579

15771580
/**
15781581
* Scan an open fp for the required __HALT_COMPILER(); ?> token and verify
15791582
* that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS
15801583
* or FAILURE is returned and pphar is set to a pointer to the phar's manifest
15811584
*/
1582-
static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
1583-
{
1585+
static zend_result phar_open_from_fp(
1586+
php_stream* fp,
1587+
const char *fname,
1588+
size_t fname_len,
1589+
/* copyable & hash update */ zend_string *alias,
1590+
uint32_t options,
1591+
phar_archive_data** pphar,
1592+
char **error
1593+
) {
15841594
static const char token[] = "__HALT_COMPILER();";
15851595
static const char zip_magic[] = "PK\x03\x04";
15861596
static const char gz_magic[] = "\x1f\x8b\x08";
@@ -1731,20 +1741,22 @@ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t f
17311741

17321742
if (!memcmp(pos, zip_magic, 4)) {
17331743
php_stream_seek(fp, 0, SEEK_END);
1734-
return phar_parse_zipfile(fp, fname, fname_len, alias, alias_len, pphar, error);
1744+
return phar_parse_zipfile(fp, fname, fname_len, alias, pphar, error);
17351745
}
17361746

17371747
if (got >= 512) {
17381748
if (phar_is_tar(pos, fname)) {
17391749
php_stream_rewind(fp);
1740-
return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error);
1750+
return phar_parse_tarfile(fp, fname, fname_len, alias, pphar, compression, error);
17411751
}
17421752
}
17431753
}
17441754

17451755
if (got > 0 && (pos = php_memnistr(buffer, token, tokenlen, buffer + got + sizeof(token))) != NULL) {
17461756
halt_offset += (pos - buffer); /* no -tokenlen+tokenlen here */
1747-
return phar_parse_pharfile(fp, fname, fname_len, alias, alias_len, halt_offset, pphar, compression, error);
1757+
const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL;
1758+
size_t alias_len = alias ? ZSTR_LEN(alias) : 0;
1759+
return phar_parse_pharfile(fp, fname, fname_len, alias_cstr, alias_len, halt_offset, pphar, compression, error);
17481760
}
17491761

17501762
halt_offset += got;
@@ -1753,7 +1765,6 @@ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t f
17531765

17541766
MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (__HALT_COMPILER(); not found)")
17551767
}
1756-
/* }}} */
17571768

17581769
/*
17591770
* given the location of the file extension and the start of the file path,
@@ -2267,7 +2278,7 @@ zend_string* phar_split_fname(const char *filename, size_t filename_len, zend_st
22672278
* Invoked when a user calls Phar::mapPhar() from within an executing .phar
22682279
* to set up its manifest directly
22692280
*/
2270-
ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error) /* {{{ */
2281+
ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error) /* {{{ */
22712282
{
22722283
*error = NULL;
22732284

@@ -2309,7 +2320,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zen
23092320
fname = actual;
23102321
}
23112322

2312-
zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, REPORT_ERRORS, NULL, error);
2323+
zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, REPORT_ERRORS, NULL, error);
23132324

23142325
if (actual) {
23152326
zend_string_release_ex(actual, 0);

ext/phar/phar_internal.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,10 @@ void phar_object_init(void);
406406
void phar_destroy_phar_data(phar_archive_data *phar);
407407

408408
ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip);
409-
zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error);
409+
zend_result phar_open_from_filename(char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error);
410410
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
411411
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
412-
ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error);
412+
ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error);
413413
zend_result phar_free_alias(const phar_archive_data *phar);
414414
phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error);
415415
zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, const char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error);
@@ -445,12 +445,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar);
445445

446446
/* tar functions in tar.c */
447447
bool phar_is_tar(const char *buf, const char *fname);
448-
zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error);
448+
zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, uint32_t compression, char **error);
449449
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
450450
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
451451

452452
/* zip functions in zip.c */
453-
zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error);
453+
zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, char **error);
454454
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
455455
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
456456

ext/phar/tar.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,15 @@ static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream
202202
}
203203
/* }}} */
204204

205-
zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */
206-
{
205+
zend_result phar_parse_tarfile(
206+
php_stream* fp,
207+
const char *fname,
208+
size_t fname_len,
209+
/* copyable & hash update */ zend_string *alias,
210+
phar_archive_data** pphar,
211+
uint32_t compression,
212+
char **error
213+
) {
207214
char buf[512], *actual_alias = NULL, *p;
208215
phar_entry_info entry = {0};
209216
size_t pos = 0, read, totalsize;
@@ -679,8 +686,8 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l
679686

680687
zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len, myphar);
681688
} else {
682-
if (alias_len) {
683-
phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len);
689+
if (alias) {
690+
phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias);
684691
if (fd_ptr) {
685692
if (SUCCESS != phar_free_alias(fd_ptr)) {
686693
if (error) {
@@ -690,9 +697,9 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l
690697
return FAILURE;
691698
}
692699
}
693-
zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, myphar);
694-
myphar->alias = pestrndup(alias, alias_len, myphar->is_persistent);
695-
myphar->alias_len = alias_len;
700+
zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, myphar);
701+
myphar->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), myphar->is_persistent);
702+
myphar->alias_len = ZSTR_LEN(alias);
696703
} else {
697704
myphar->alias = pestrndup(ZSTR_VAL(myphar->fname), ZSTR_LEN(myphar->fname), myphar->is_persistent);
698705
myphar->alias_len = ZSTR_LEN(myphar->fname);
@@ -707,7 +714,6 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l
707714

708715
return SUCCESS;
709716
}
710-
/* }}} */
711717

712718
struct _phar_pass_tar_info {
713719
php_stream *old;

ext/phar/zip.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,14 @@ static char *phar_find_eocd(const char *s, size_t n)
224224
* This is used by phar_open_from_fp to process a zip-based phar, but can be called
225225
* directly.
226226
*/
227-
zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error) /* {{{ */
228-
{
227+
zend_result phar_parse_zipfile(
228+
php_stream *fp,
229+
const char *fname,
230+
size_t fname_len,
231+
/* copyable & hash update */ zend_string *alias,
232+
phar_archive_data** pphar,
233+
char **error
234+
) {
229235
phar_zip_dir_end locator;
230236
char buf[sizeof(locator) + 65536];
231237
zend_off_t size;
@@ -760,8 +766,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l
760766

761767
zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), mydata->alias, mydata->alias_len, mydata);
762768
} else {
763-
if (alias_len) {
764-
phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len);
769+
if (alias) {
770+
phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias);
765771
if (fd_ptr) {
766772
if (SUCCESS != phar_free_alias(fd_ptr)) {
767773
if (error) {
@@ -772,9 +778,9 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l
772778
}
773779
}
774780

775-
zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata);
776-
mydata->alias = pestrndup(alias, alias_len, mydata->is_persistent);
777-
mydata->alias_len = alias_len;
781+
zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, mydata);
782+
mydata->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), mydata->is_persistent);
783+
mydata->alias_len = ZSTR_LEN(alias);
778784
} else {
779785
mydata->alias = pestrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname), mydata->is_persistent);
780786
mydata->alias_len = fname_len;

0 commit comments

Comments
 (0)