Skip to content

Commit ea67883

Browse files
authored
ext/phar: refactor phar_create_signature() to return a zend_string* (#21843)
Instead of using out parameters.
1 parent fe5d418 commit ea67883

5 files changed

Lines changed: 45 additions & 53 deletions

File tree

ext/phar/phar.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,32 +2995,27 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
29952995

29962996
switch(phar->sig_flags) {
29972997
default: {
2998-
char *digest = NULL;
2999-
size_t digest_len;
3000-
30012998
char *signature_error = NULL;
3002-
if (FAILURE == phar_create_signature(phar, newfile, &digest, &digest_len, &signature_error)) {
2999+
zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
3000+
if (!signature) {
30033001
spprintf(error, 0, "phar error: unable to write signature: %s", signature_error);
30043002
efree(signature_error);
30053003

3006-
if (digest) {
3007-
efree(digest);
3008-
}
30093004
if (must_close_old_file) {
30103005
php_stream_close(oldfile);
30113006
}
30123007
php_stream_close(newfile);
30133008
return EOF;
30143009
}
30153010

3016-
php_stream_write(newfile, digest, digest_len);
3017-
efree(digest);
3011+
php_stream_write(newfile, ZSTR_VAL(signature), ZSTR_LEN(signature));
30183012
if (phar->sig_flags == PHAR_SIG_OPENSSL ||
30193013
phar->sig_flags == PHAR_SIG_OPENSSL_SHA256 ||
30203014
phar->sig_flags == PHAR_SIG_OPENSSL_SHA512) {
3021-
phar_set_32(sig_buf, digest_len);
3015+
phar_set_32(sig_buf, ZSTR_LEN(signature));
30223016
php_stream_write(newfile, sig_buf, 4);
30233017
}
3018+
zend_string_release_ex(signature, false);
30243019
break;
30253020
}
30263021
}

ext/phar/phar_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *ali
413413
zend_result phar_free_alias(const phar_archive_data *phar);
414414
zend_result phar_get_archive(phar_archive_data **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, char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error);
416-
ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error);
416+
ZEND_ATTRIBUTE_NONNULL zend_string* phar_create_signature(phar_archive_data *phar, php_stream *fp, char **error);
417417

418418
/* utility functions */
419419
zend_string *phar_create_default_stub(const zend_string *php_index_str, const zend_string *web_index_str, char **error);

ext/phar/tar.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -968,9 +968,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
968968
phar_entry_info entry = {0};
969969
php_stream *oldfile, *newfile;
970970
bool must_close_old_file = false;
971-
size_t signature_length;
972971
struct _phar_pass_tar_info pass;
973-
char *buf, *signature, sigbuf[8];
972+
char *buf, sigbuf[8];
974973

975974
entry.flags = PHAR_ENT_PERM_DEF_FILE;
976975
entry.timestamp = time(NULL);
@@ -1168,7 +1167,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
11681167
/* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */
11691168
if (!phar->is_data || phar->sig_flags) {
11701169
char *signature_error = NULL;
1171-
if (FAILURE == phar_create_signature(phar, newfile, &signature, &signature_length, &signature_error)) {
1170+
zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
1171+
if (!signature) {
11721172
spprintf(error, 0, "phar error: unable to write signature to tar-based phar: %s", signature_error);
11731173
efree(signature_error);
11741174

@@ -1184,7 +1184,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
11841184
if (entry.fp == NULL) {
11851185
*error = estrdup("phar error: unable to create temporary file");
11861186

1187-
efree(signature);
1187+
zend_string_release_ex(signature, false);
11881188
if (must_close_old_file) {
11891189
php_stream_close(oldfile);
11901190
}
@@ -1203,10 +1203,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
12031203
# define PHAR_SET_32(destination, source) memcpy(destination, &source, 4)
12041204
#endif
12051205
PHAR_SET_32(sigbuf, phar->sig_flags);
1206-
PHAR_SET_32(sigbuf + 4, signature_length);
1206+
PHAR_SET_32(sigbuf + 4, ZSTR_LEN(signature));
12071207

1208-
if (8 != php_stream_write(entry.fp, sigbuf, 8) || signature_length != php_stream_write(entry.fp, signature, signature_length)) {
1209-
efree(signature);
1208+
if (8 != php_stream_write(entry.fp, sigbuf, 8) || ZSTR_LEN(signature) != php_stream_write(entry.fp, ZSTR_VAL(signature), ZSTR_LEN(signature))) {
1209+
zend_string_release_ex(signature, false);
12101210
spprintf(error, 0, "phar error: unable to write signature to tar-based phar %s", ZSTR_VAL(phar->fname));
12111211

12121212
if (must_close_old_file) {
@@ -1218,11 +1218,11 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
12181218

12191219
ALLOCA_FLAG(use_heap);
12201220
ZSTR_ALLOCA_INIT(entry.filename, ".phar/signature.bin", sizeof(".phar/signature.bin")-1, use_heap);
1221-
efree(signature);
1222-
entry.uncompressed_filesize = entry.compressed_filesize = signature_length + 8;
1221+
entry.uncompressed_filesize = entry.compressed_filesize = ZSTR_LEN(signature) + 8;
12231222
/* throw out return value and write the signature */
12241223
phar_tar_writeheaders_int(&entry, &pass);
12251224
ZSTR_ALLOCA_FREE(entry.filename, use_heap);
1225+
zend_string_release_ex(signature, false);
12261226

12271227
if (*error) {
12281228
if (must_close_old_file) {

ext/phar/util.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,8 +1783,9 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
17831783
}
17841784
/* }}} */
17851785

1786-
ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error) /* {{{ */
1786+
ZEND_ATTRIBUTE_NONNULL zend_string* phar_create_signature(phar_archive_data *phar, php_stream *fp, char **error) /* {{{ */
17871787
{
1788+
zend_string *signature = NULL;
17881789
unsigned char buf[1024];
17891790
size_t sig_len;
17901791

@@ -1807,8 +1808,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18071808
}
18081809

18091810
PHP_SHA512Final(digest, &context);
1810-
*signature = estrndup((char *) digest, 64);
1811-
*signature_length = 64;
1811+
signature = zend_string_init((const char*)digest, 64, false);
18121812
break;
18131813
}
18141814
default:
@@ -1825,8 +1825,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18251825
}
18261826

18271827
PHP_SHA256Final(digest, &context);
1828-
*signature = estrndup((char *) digest, 32);
1829-
*signature_length = 32;
1828+
signature = zend_string_init((const char*)digest, 32, false);
18301829
break;
18311830
}
18321831
case PHAR_SIG_OPENSSL_SHA512:
@@ -1852,22 +1851,22 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18521851

18531852
if (in == NULL) {
18541853
spprintf(error, 0, "unable to write to phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
1855-
return FAILURE;
1854+
return NULL;
18561855
}
18571856

18581857
key = PEM_read_bio_PrivateKey(in, NULL,NULL, "");
18591858
BIO_free(in);
18601859

18611860
if (!key) {
18621861
*error = estrdup("unable to process private key");
1863-
return FAILURE;
1862+
return NULL;
18641863
}
18651864

18661865
md_ctx = EVP_MD_CTX_create();
18671866
if (md_ctx == NULL) {
18681867
EVP_PKEY_free(key);
18691868
spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
1870-
return FAILURE;
1869+
return NULL;
18711870
}
18721871

18731872
siglen = EVP_PKEY_size(key);
@@ -1878,7 +1877,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18781877
EVP_MD_CTX_destroy(md_ctx);
18791878
efree(sigbuf);
18801879
spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
1881-
return FAILURE;
1880+
return NULL;
18821881
}
18831882

18841883
while ((sig_len = php_stream_read(fp, (char*)buf, sizeof(buf))) > 0) {
@@ -1887,7 +1886,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18871886
EVP_MD_CTX_destroy(md_ctx);
18881887
efree(sigbuf);
18891888
spprintf(error, 0, "unable to update the openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
1890-
return FAILURE;
1889+
return NULL;
18911890
}
18921891
}
18931892

@@ -1896,12 +1895,14 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
18961895
EVP_MD_CTX_destroy(md_ctx);
18971896
efree(sigbuf);
18981897
spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
1899-
return FAILURE;
1898+
return NULL;
19001899
}
19011900

19021901
sigbuf[siglen] = '\0';
19031902
EVP_PKEY_free(key);
19041903
EVP_MD_CTX_destroy(md_ctx);
1904+
signature = zend_string_init((const char*)sigbuf, siglen, false);
1905+
efree(sigbuf);
19051906
#else
19061907
size_t siglen;
19071908
sigbuf = NULL;
@@ -1910,11 +1911,11 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
19101911

19111912
if (FAILURE == phar_call_openssl_signverify(true, fp, php_stream_tell(fp), PHAR_G(openssl_privatekey), PHAR_G(openssl_privatekey_len), (char **)&sigbuf, &siglen, phar->sig_flags)) {
19121913
spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
1913-
return FAILURE;
1914+
return NULL;
19141915
}
1916+
signature = zend_string_init((const char*)sigbuf, siglen, false);
1917+
efree(sigbuf);
19151918
#endif
1916-
*signature = (char *) sigbuf;
1917-
*signature_length = siglen;
19181919
}
19191920
break;
19201921
case PHAR_SIG_SHA1: {
@@ -1928,8 +1929,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
19281929
}
19291930

19301931
PHP_SHA1Final(digest, &context);
1931-
*signature = estrndup((char *) digest, 20);
1932-
*signature_length = 20;
1932+
signature = zend_string_init((const char*)digest, 20, false);
19331933
break;
19341934
}
19351935
case PHAR_SIG_MD5: {
@@ -1943,14 +1943,13 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
19431943
}
19441944

19451945
PHP_MD5Final(digest, &context);
1946-
*signature = estrndup((char *) digest, 16);
1947-
*signature_length = 16;
1946+
signature = zend_string_init((const char*)digest, 16, false);
19481947
break;
19491948
}
19501949
}
19511950

1952-
phar->sig_len = phar_hex_str((const char *)*signature, *signature_length, &phar->signature);
1953-
return SUCCESS;
1951+
phar->sig_len = phar_hex_str(ZSTR_VAL(signature), ZSTR_LEN(signature), &phar->signature);
1952+
return signature;
19541953
}
19551954
/* }}} */
19561955

ext/phar/zip.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,8 +1148,7 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
11481148
{
11491149
/* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */
11501150
if (!phar->is_data || phar->sig_flags) {
1151-
size_t signature_length;
1152-
char *signature, sigbuf[8];
1151+
char sigbuf[8];
11531152
phar_entry_info entry = {0};
11541153
php_stream *newfile;
11551154
zend_off_t tell;
@@ -1171,11 +1170,10 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
11711170
}
11721171

11731172
char *signature_error = NULL;
1174-
if (FAILURE == phar_create_signature(phar, newfile, &signature, &signature_length, &signature_error)) {
1175-
if (signature_error) {
1176-
spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar: %s", signature_error);
1177-
efree(signature_error);
1178-
}
1173+
zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
1174+
if (!signature) {
1175+
spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar: %s", signature_error);
1176+
efree(signature_error);
11791177

11801178
php_stream_close(newfile);
11811179
return FAILURE;
@@ -1185,17 +1183,17 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
11851183
entry.fp_type = PHAR_MOD;
11861184
entry.is_modified = 1;
11871185
if (entry.fp == NULL) {
1188-
efree(signature);
1186+
zend_string_release_ex(signature, false);
11891187
spprintf(pass->error, 0, "phar error: unable to create temporary file for signature");
11901188
php_stream_close(newfile);
11911189
return FAILURE;
11921190
}
11931191

11941192
PHAR_SET_32(sigbuf, phar->sig_flags);
1195-
PHAR_SET_32(sigbuf + 4, signature_length);
1193+
PHAR_SET_32(sigbuf + 4, ZSTR_LEN(signature));
11961194

1197-
if (Z_UL(8) != php_stream_write(entry.fp, sigbuf, 8) || signature_length != php_stream_write(entry.fp, signature, signature_length)) {
1198-
efree(signature);
1195+
if (Z_UL(8) != php_stream_write(entry.fp, sigbuf, 8) || ZSTR_LEN(signature) != php_stream_write(entry.fp, ZSTR_VAL(signature), ZSTR_LEN(signature))) {
1196+
zend_string_release_ex(signature, false);
11991197
if (pass->error) {
12001198
spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar %s", ZSTR_VAL(phar->fname));
12011199
}
@@ -1206,13 +1204,13 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
12061204

12071205
ALLOCA_FLAG(use_heap);
12081206
ZSTR_ALLOCA_INIT(entry.filename, ".phar/signature.bin", sizeof(".phar/signature.bin")-1, use_heap);
1209-
efree(signature);
1210-
entry.uncompressed_filesize = entry.compressed_filesize = signature_length + 8;
1207+
entry.uncompressed_filesize = entry.compressed_filesize = ZSTR_LEN(signature) + 8;
12111208
entry.phar = phar;
12121209
/* throw out return value and write the signature */
12131210
phar_zip_changed_apply_int(&entry, (void *)pass);
12141211
ZSTR_ALLOCA_FREE(entry.filename, use_heap);
12151212
php_stream_close(newfile);
1213+
zend_string_release_ex(signature, false);
12161214

12171215
if (pass->error && *(pass->error)) {
12181216
/* error is set by writeheaders */

0 commit comments

Comments
 (0)