diff options
Diffstat (limited to 'ext/standard/mail.c')
-rw-r--r-- | ext/standard/mail.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/ext/standard/mail.c b/ext/standard/mail.c index af7d5f114b..3080a3957b 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -105,11 +105,11 @@ static void php_mail_build_headers_elem(smart_str *s, zend_string *key, zval *va switch(Z_TYPE_P(val)) { case IS_STRING: if (php_mail_build_headers_check_field_name(key) != SUCCESS) { - php_error_docref(NULL, E_WARNING, "Header field name (%s) contains invalid chars", ZSTR_VAL(key)); + zend_value_error("Header name \"%s\" contains invalid characters", ZSTR_VAL(key)); return; } if (php_mail_build_headers_check_field_value(val) != SUCCESS) { - php_error_docref(NULL, E_WARNING, "Header field value (%s => %s) contains invalid chars or format", ZSTR_VAL(key), Z_STRVAL_P(val)); + zend_value_error("Header \"%s\" has invalid format, or contains invalid characters", ZSTR_VAL(key)); return; } smart_str_append(s, key); @@ -121,7 +121,7 @@ static void php_mail_build_headers_elem(smart_str *s, zend_string *key, zval *va php_mail_build_headers_elems(s, key, val); break; default: - php_error_docref(NULL, E_WARNING, "Headers array elements must be string or array (%s)", ZSTR_VAL(key)); + zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_type_name(val)); } } @@ -133,12 +133,12 @@ static void php_mail_build_headers_elems(smart_str *s, zend_string *key, zval *v ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(val), tmp_key, tmp_val) { if (tmp_key) { - php_error_docref(NULL, E_WARNING, "Multiple header key must be numeric index (%s)", ZSTR_VAL(tmp_key)); - continue; + zend_type_error("Header \"%s\" must only contain numeric keys, \"%s\" found", ZSTR_VAL(key), ZSTR_VAL(tmp_key)); + break; } if (Z_TYPE_P(tmp_val) != IS_STRING) { - php_error_docref(NULL, E_WARNING, "Multiple header values must be string (%s)", ZSTR_VAL(key)); - continue; + zend_type_error("Header \"%s\" must only contain values of type string, %s found", ZSTR_VAL(key), zend_zval_type_name(tmp_val)); + break; } php_mail_build_headers_elem(s, key, tmp_val); } ZEND_HASH_FOREACH_END(); @@ -154,8 +154,8 @@ PHPAPI zend_string *php_mail_build_headers(HashTable *headers) ZEND_HASH_FOREACH_KEY_VAL(headers, idx, key, val) { if (!key) { - php_error_docref(NULL, E_WARNING, "Found numeric header (" ZEND_LONG_FMT ")", idx); - continue; + zend_type_error("Header name cannot be numeric, " ZEND_LONG_FMT " given", idx); + break; } /* https://tools.ietf.org/html/rfc2822#section-3.6 */ switch(ZSTR_LEN(key)) { @@ -189,8 +189,8 @@ PHPAPI zend_string *php_mail_build_headers(HashTable *headers) break; case sizeof("to")-1: /* "to", "cc" */ if (!strncasecmp("to", ZSTR_VAL(key), ZSTR_LEN(key))) { - php_error_docref(NULL, E_WARNING, "Extra header cannot contain 'To' header"); - continue; + zend_value_error("The additional headers cannot contain the \"To\" header"); + break; } if (!strncasecmp("cc", ZSTR_VAL(key), ZSTR_LEN(key))) { PHP_MAIL_BUILD_HEADER_CHECK("cc", s, key, val); @@ -223,14 +223,19 @@ PHPAPI zend_string *php_mail_build_headers(HashTable *headers) break; case sizeof("subject")-1: if (!strncasecmp("subject", ZSTR_VAL(key), ZSTR_LEN(key))) { - php_error_docref(NULL, E_WARNING, "Extra header cannot contain 'Subject' header"); - continue; + zend_value_error("The additional headers cannot contain the \"Subject\" header"); + break; } PHP_MAIL_BUILD_HEADER_DEFAULT(s, key, val); break; default: PHP_MAIL_BUILD_HEADER_DEFAULT(s, key, val); } + + if (EG(exception)) { + smart_str_free(&s); + return NULL; + } } ZEND_HASH_FOREACH_END(); /* Remove the last \r\n */ @@ -271,6 +276,9 @@ PHP_FUNCTION(mail) headers_str = php_trim(headers_str, NULL, 0, 2); } else if (headers_ht) { headers_str = php_mail_build_headers(headers_ht); + if (EG(exception)) { + RETURN_THROWS(); + } } if (to_len > 0) { |