Skip to content

Commit 9a24c6a

Browse files
committed
ext/phar: assert function are not passed NULL pointers
This simplifies some of the logic and makes the assumptions clear
1 parent 670a8f7 commit 9a24c6a

File tree

8 files changed

+218
-399
lines changed

8 files changed

+218
-399
lines changed

ext/phar/phar.c

Lines changed: 77 additions & 158 deletions
Large diffs are not rendered by default.

ext/phar/phar_internal.h

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -404,15 +404,15 @@ void phar_request_initialize(void);
404404
void phar_object_init(void);
405405
void phar_destroy_phar_data(phar_archive_data *phar);
406406

407-
zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip);
407+
ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip);
408408
zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
409-
zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
410-
zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
411-
zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error);
409+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
410+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
411+
ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error);
412412
zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len);
413413
zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error);
414414
zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_len, char **error);
415-
zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error);
415+
ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error);
416416

417417
/* utility functions */
418418
zend_string *phar_create_default_stub(const char *index_php, const char *web_index, char **error);
@@ -424,7 +424,7 @@ void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, size_t filen
424424
zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len);
425425
zend_string *phar_find_in_include_path(zend_string *file, phar_archive_data **pphar);
426426
char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd);
427-
phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, char **error);
427+
ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data *phar, phar_entry_info *entry, char **error);
428428
void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker, uint32_t zip_metadata_len, bool persistent);
429429
bool phar_metadata_tracker_has_data(const phar_metadata_tracker* tracker, bool persistent);
430430
/* If this has data, free it and set all values to undefined. */
@@ -436,22 +436,22 @@ zend_result phar_metadata_tracker_unserialize_or_copy(phar_metadata_tracker* tra
436436
void destroy_phar_manifest_entry(zval *zv);
437437
int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_off_t position, bool follow_links);
438438
php_stream *phar_get_efp(phar_entry_info *entry, bool follow_links);
439-
zend_result phar_copy_entry_fp(phar_entry_info *source, phar_entry_info *dest, char **error);
440-
zend_result phar_open_entry_fp(phar_entry_info *entry, char **error, bool follow_links);
439+
ZEND_ATTRIBUTE_NONNULL zend_result phar_copy_entry_fp(phar_entry_info *source, phar_entry_info *dest, char **error);
440+
ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, char **error, bool follow_links);
441441
phar_entry_info *phar_get_link_source(phar_entry_info *entry);
442442
zend_result phar_open_archive_fp(phar_archive_data *phar);
443443
zend_result phar_copy_on_write(phar_archive_data **pphar);
444444

445445
/* tar functions in tar.c */
446446
bool phar_is_tar(char *buf, char *fname);
447447
zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error);
448-
zend_result phar_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
449-
void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
448+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
449+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
450450

451451
/* zip functions in zip.c */
452452
zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error);
453-
zend_result phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
454-
void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
453+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
454+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
455455

456456
#ifdef PHAR_MAIN
457457
extern const php_stream_wrapper php_stream_phar_wrapper;
@@ -465,10 +465,10 @@ void phar_entry_delref(phar_entry_data *idata);
465465

466466
phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t path_len, char **error, bool security);
467467
phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security);
468-
phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
469-
zend_result phar_get_entry_data(phar_entry_data **ret, char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
470-
void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
471-
void phar_flush(phar_archive_data *archive, char **error);
468+
ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
469+
ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
470+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
471+
ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *archive, char **error);
472472
zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len, const char **ext_str, size_t *ext_len, int executable, int for_create, bool is_complete);
473473
zend_result phar_split_fname(const char *filename, size_t filename_len, char **arch, size_t *arch_len, char **entry, size_t *entry_len, int executable, int for_create);
474474

@@ -484,6 +484,6 @@ typedef enum {
484484
pcr_err_empty_entry
485485
} phar_path_check_result;
486486

487-
phar_path_check_result phar_path_check(char **p, size_t *len, const char **error);
487+
ZEND_ATTRIBUTE_NONNULL phar_path_check_result phar_path_check(char **p, size_t *len, const char **error);
488488

489489
END_EXTERN_C()

ext/phar/phar_object.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4108,7 +4108,7 @@ PHP_METHOD(Phar, delMetadata)
41084108
}
41094109
/* }}} */
41104110

4111-
static zend_result phar_extract_file(bool overwrite, phar_entry_info *entry, const zend_string *path, char **error) /* {{{ */
4111+
ZEND_ATTRIBUTE_NONNULL static zend_result phar_extract_file(bool overwrite, phar_entry_info *entry, const zend_string *path, char **error) /* {{{ */
41124112
{
41134113
php_stream_statbuf ssb;
41144114
size_t len;
@@ -4245,9 +4245,10 @@ static zend_result phar_extract_file(bool overwrite, phar_entry_info *entry, con
42454245
}
42464246

42474247
if ((phar_get_fp_type(entry) == PHAR_FP && (entry->flags & PHAR_ENT_COMPRESSION_MASK)) || !phar_get_efp(entry, false)) {
4248-
if (FAILURE == phar_open_entry_fp(entry, error, true)) {
4249-
if (error) {
4250-
spprintf(error, 4096, "Cannot extract \"%s\" to \"%s\", unable to open internal file pointer: %s", ZSTR_VAL(entry->filename), fullpath, *error);
4248+
char *open_entry_error = NULL;
4249+
if (FAILURE == phar_open_entry_fp(entry, &open_entry_error, true)) {
4250+
if (open_entry_error) {
4251+
spprintf(error, 4096, "Cannot extract \"%s\" to \"%s\", unable to open internal file pointer: %s", ZSTR_VAL(entry->filename), fullpath, open_entry_error);
42514252
} else {
42524253
spprintf(error, 4096, "Cannot extract \"%s\" to \"%s\", unable to open internal file pointer", ZSTR_VAL(entry->filename), fullpath);
42534254
}
@@ -4285,7 +4286,7 @@ static zend_result phar_extract_file(bool overwrite, phar_entry_info *entry, con
42854286
}
42864287
/* }}} */
42874288

4288-
static int extract_helper(const phar_archive_data *archive, zend_string *search, const zend_string *path_to, bool overwrite, char **error) { /* {{{ */
4289+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 3, 5) static int extract_helper(const phar_archive_data *archive, zend_string *search, const zend_string *path_to, bool overwrite, char **error) { /* {{{ */
42894290
int extracted = 0;
42904291
phar_entry_info *entry;
42914292

ext/phar/phar_path_check.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
#include "phar_internal.h"
2020

21-
phar_path_check_result phar_path_check(char **s, size_t *len, const char **error)
21+
ZEND_ATTRIBUTE_NONNULL phar_path_check_result phar_path_check(char **s, size_t *len, const char **error)
2222
{
2323
const unsigned char *p = (const unsigned char*)*s;
2424
const unsigned char *m;

ext/phar/stream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ BEGIN_EXTERN_C()
2121
#include "ext/standard/url.h"
2222

2323
php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options);
24-
void phar_entry_remove(phar_entry_data *idata, char **error);
24+
ZEND_ATTRIBUTE_NONNULL void phar_entry_remove(phar_entry_data *idata, char **error);
2525

2626
static php_stream* phar_wrapper_open_url(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC);
2727
static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context);

0 commit comments

Comments
 (0)