summaryrefslogtreecommitdiff
path: root/ext/standard/mail.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/mail.c')
-rw-r--r--ext/standard/mail.c34
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) {