Skip to content

Commit 8f1b7c2

Browse files
committed
mbstring: Fix memory leak in mail header parsing
A header field name with no value (input ending at the colon) leaves fld_name allocated but unreleased, since the cleanup blocks only fire when both fld_name and fld_val are set. Release the dangling fld_name in both the loop-body and end-of-input branches.
1 parent 17f6752 commit 8f1b7c2

1 file changed

Lines changed: 14 additions & 10 deletions

File tree

ext/mbstring/mbstring.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4444,12 +4444,14 @@ static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t
44444444
fld_val = zend_string_init(token, token_pos, 0);
44454445
}
44464446

4447-
if (fld_name != NULL && fld_val != NULL) {
4448-
zval val;
4449-
zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
4450-
ZVAL_STR(&val, fld_val);
4447+
if (fld_name != NULL) {
4448+
if (fld_val != NULL) {
4449+
zval val;
4450+
zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
4451+
ZVAL_STR(&val, fld_val);
44514452

4452-
zend_hash_update(ht, fld_name, &val);
4453+
zend_hash_update(ht, fld_name, &val);
4454+
}
44534455

44544456
zend_string_release_ex(fld_name, 0);
44554457
}
@@ -4490,11 +4492,13 @@ static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t
44904492
if(token && token_pos > 0) {
44914493
fld_val = zend_string_init(token, token_pos, 0);
44924494
}
4493-
if (fld_name != NULL && fld_val != NULL) {
4494-
zval val;
4495-
zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
4496-
ZVAL_STR(&val, fld_val);
4497-
zend_hash_update(ht, fld_name, &val);
4495+
if (fld_name != NULL) {
4496+
if (fld_val != NULL) {
4497+
zval val;
4498+
zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
4499+
ZVAL_STR(&val, fld_val);
4500+
zend_hash_update(ht, fld_name, &val);
4501+
}
44984502

44994503
zend_string_release_ex(fld_name, 0);
45004504
}

0 commit comments

Comments
 (0)