Doesn't this problem exist in PHP_5_1 branch?
--Jani On Mon, 21 Nov 2005, Rui Hirokawa wrote:
hirokawa Mon Nov 21 18:21:24 2005 EDT Modified files: (Branch: PHP_4_4) /php-src/ext/mbstring mbstring.c Log: fixed #35307 unexpected header can be injected to mb_send_mail() (the patch is made by masugata). http://cvs.php.net/diff.php/php-src/ext/mbstring/mbstring.c?r1=1.142.2.47.2.4&r2=1.142.2.47.2.5&ty=u Index: php-src/ext/mbstring/mbstring.c diff -u php-src/ext/mbstring/mbstring.c:1.142.2.47.2.4 php-src/ext/mbstring/mbstring.c:1.142.2.47.2.5 --- php-src/ext/mbstring/mbstring.c:1.142.2.47.2.4 Sat Nov 19 01:39:39 2005 +++ php-src/ext/mbstring/mbstring.c Mon Nov 21 18:21:19 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.c,v 1.142.2.47.2.4 2005/11/19 06:39:39 hirokawa Exp $ */ +/* $Id: mbstring.c,v 1.142.2.47.2.5 2005/11/21 23:21:19 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" @@ -3467,6 +3467,22 @@ * Sends an email message with MIME scheme */ #if HAVE_SENDMAIL +#define SKIP_LONG_HEADER_SEP_MBSTRING(str, pos) \ + if (str[pos] == '\r' && str[pos + 1] == '\n' && (str[pos + 2] == ' ' || str[pos + 2] == '\t')) { \ + pos += 3; \ + while (str[pos] == ' ' || str[pos] == '\t') { \ + pos++; \ + } \ + continue; \ + } \ + else if (str[pos] == '\n' && (str[pos + 1] == ' ' || str[pos + 1] == '\t')) { \ + pos += 2; \ + while (str[pos] == ' ' || str[pos] == '\t') { \ + pos++; \ + } \ + continue; \ + } \ + PHP_FUNCTION(mb_send_mail) { int argc, n; @@ -3482,6 +3498,8 @@ mbfl_memory_device device; /* automatic allocateable buffer for additional header */ const mbfl_language *lang; int err = 0; + char *to_r; + int to_len, i; /* initialize */ mbfl_memory_device_init(&device, 0, 0); @@ -3508,6 +3526,32 @@ convert_to_string_ex(argv[0]); if (Z_STRVAL_PP(argv[0])) { to = Z_STRVAL_PP(argv[0]); + to_len = Z_STRLEN_PP(argv[0]); + if (to_len > 0) { + to_r = estrndup(to, to_len); + for (; to_len; to_len--) { + if (!isspace((unsigned char) to_r[to_len - 1])) { + break; + } + to_r[to_len - 1] = '\0'; + } + for (i = 0; to_r[i]; i++) { + if (iscntrl((unsigned char) to_r[i])) { + /* According to RFC 822, section 3.1.1 long headers may be +separated into + * parts using CRLF followed at least one linear-white-space +character ('\t' or ' '). + * To prevent these separators from being replaced with a space, +we use the + * SKIP_LONG_HEADER_SEP_MBSTRING to skip over them. + */ + SKIP_LONG_HEADER_SEP_MBSTRING(to_r, i); + to_r[i] = ' '; + } + } + } else { + to_r = to; + } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing To: field"); err = 1; @@ -3606,12 +3650,15 @@ extra_cmd = php_escape_shell_cmd(extra_cmd); } - if (!err && php_mail(to, subject, message, headers, extra_cmd TSRMLS_CC)) { + if (!err && php_mail(to_r, subject, message, headers, extra_cmd TSRMLS_CC)) { RETVAL_TRUE; } else { RETVAL_FALSE; } + if (to_r != to) { + efree(to_r); + } if (extra_cmd) { efree(extra_cmd); }
-- Give me your money at @ <http://pecl.php.net/wishlist.php/sniper> Donating money may make me happier and friendlier for a limited period! Death to all 4 letter abbreviations starting with P! -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php