X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-apfd;a=blobdiff_plain;f=php_apfd.c;h=4159620236ff99c614454573f678636062d9fae2;hp=0e1d749d5680fd9fc8c3d957702e83871b2d828e;hb=45d30642b8c420e2d9ebdb60b66282c56d59a9cf;hpb=0a7cc720ed246ad0468d089ec8431138b075323e diff --git a/php_apfd.c b/php_apfd.c index 0e1d749..4159620 100644 --- a/php_apfd.c +++ b/php_apfd.c @@ -23,28 +23,48 @@ #if PHP_VERSION_ID >= 70000 +struct apfd { + zval post; + zval files; +}; + #define APFD_SG(t) &PG(http_globals)[t] static inline sapi_post_entry *apfd_get_post_entry(const char *ct_str, size_t ct_len) { return zend_hash_str_find_ptr(&SG(known_post_content_types), ct_str, ct_len); } -static inline zval *apfd_backup_files(void) +static inline void apfd_backup(struct apfd *apfd) { if (SG(rfc1867_uploaded_files)) { destroy_uploaded_files_hash(); } - return NULL; + + zval_ptr_dtor(APFD_SG(TRACK_VARS_POST)); + array_init(&apfd->post); + ZVAL_COPY_VALUE(APFD_SG(TRACK_VARS_POST), &apfd->post); + + zval_ptr_dtor(APFD_SG(TRACK_VARS_FILES)); + array_init(&apfd->files); + ZVAL_COPY_VALUE(APFD_SG(TRACK_VARS_FILES), &apfd->files); } -static inline void apfd_update_files(zval *files) +static inline void apfd_update(struct apfd *apfd) { - Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_FILES)); + zend_hash_str_update(&EG(symbol_table), "_POST", sizeof("_POST")-1, APFD_SG(TRACK_VARS_POST)); + Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_POST)); + zend_hash_str_update(&EG(symbol_table), "_FILES", sizeof("_FILES")-1, APFD_SG(TRACK_VARS_FILES)); + Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_FILES)); } #else +struct apfd { + zval *post; + zval *files; +}; + #define APFD_SG(t) PG(http_globals)[t] static inline sapi_post_entry *apfd_get_post_entry(const char *ct_str, size_t ct_len TSRMLS_DC) { @@ -56,18 +76,19 @@ static inline sapi_post_entry *apfd_get_post_entry(const char *ct_str, size_t ct return NULL; } -static inline zval *apfd_backup_files(TSRMLS_D) +static inline void apfd_backup(struct apfd *apfd TSRMLS_DC) { - return APFD_SG(TRACK_VARS_FILES); + apfd->post = APFD_SG(TRACK_VARS_POST); + apfd->files = APFD_SG(TRACK_VARS_FILES); } -static inline void apfd_update_files(zval *files TSRMLS_DC) +static inline void apfd_update(struct apfd *apfd TSRMLS_DC) { - if (files != APFD_SG(TRACK_VARS_FILES) && APFD_SG(TRACK_VARS_FILES)) { + if (apfd->files != APFD_SG(TRACK_VARS_FILES) && APFD_SG(TRACK_VARS_FILES)) { Z_ADDREF_P(APFD_SG(TRACK_VARS_FILES)); zend_hash_update(&EG(symbol_table), "_FILES", sizeof("_FILES"), &APFD_SG(TRACK_VARS_FILES), sizeof(zval *), NULL); - if (files) { - zval_ptr_dtor(&files); + if (apfd->files) { + zval_ptr_dtor(&apfd->files); } } } @@ -75,24 +96,30 @@ static inline void apfd_update_files(zval *files TSRMLS_DC) PHP_RINIT_FUNCTION(apfd) { +#ifndef TSRMLS_C +# define TSRMLS_C +# define TSRMLS_CC +#endif + sapi_request_info *req = &SG(request_info); + /* populate form data on non-POST requests */ - if (SG(request_info).request_method && strcasecmp(SG(request_info).request_method, "POST") && SG(request_info).content_type && *SG(request_info).content_type) { - char *ct_str, *ct_dup = estrdup(SG(request_info).content_type); + if (req->request_method && strcasecmp(req->request_method, "POST") && req->content_type && *req->content_type) { + char *ct_str, *ct_dup = estrdup(req->content_type); size_t ct_end = strcspn(ct_dup, ";, "); sapi_post_entry *post_entry = NULL; - SG(request_info).content_type_dup = ct_dup; + req->content_type_dup = ct_dup; ct_str = zend_str_tolower_dup(ct_dup, ct_end); if ((post_entry = apfd_get_post_entry(ct_str, ct_end TSRMLS_CC))) { - zval *files = apfd_backup_files(TSRMLS_C); + struct apfd apfd; + + apfd_backup(&apfd TSRMLS_CC); - if (post_entry) { - SG(request_info).post_entry = post_entry; + req->post_entry = post_entry; - if (post_entry->post_reader) { - post_entry->post_reader(TSRMLS_C); - } + if (post_entry->post_reader) { + post_entry->post_reader(TSRMLS_C); } if (sapi_module.default_post_reader) { @@ -101,16 +128,13 @@ PHP_RINIT_FUNCTION(apfd) sapi_handle_post(APFD_SG(TRACK_VARS_POST) TSRMLS_CC); - /* - * the rfc1867 handler is an awkward buddy - */ - apfd_update_files(files TSRMLS_CC); + apfd_update(&apfd TSRMLS_CC); } efree(ct_str); - if (SG(request_info).content_type_dup) { - efree(SG(request_info).content_type_dup); - SG(request_info).content_type_dup = NULL; + if (req->content_type_dup) { + efree(req->content_type_dup); + req->content_type_dup = NULL; } }