From: Chris Wright Date: Mon, 21 Oct 2013 11:01:27 +0000 (+0100) Subject: Allow unlimited line length in fpm config files X-Git-Tag: PRE_64BIT_BRANCH_MERGE~33^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ad8e89d4f080626a92fc8817ab156c09b6b266a;p=php Allow unlimited line length in fpm config files Fixes bug #65933 --- diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c index cd5fc34d0f..743d4ff1c4 100644 --- a/sapi/fpm/fpm/fpm_conf.c +++ b/sapi/fpm/fpm/fpm_conf.c @@ -1465,7 +1465,8 @@ static void fpm_conf_ini_parser(zval *arg1, zval *arg2, zval *arg3, int callback int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ { int error = 0; - char buf[1024+1]; + char *buf = NULL, *newbuf = NULL; + int bufsize = 0; int fd, n; int nb_read = 1; char c = '*'; @@ -1492,19 +1493,35 @@ int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ ini_lineno = 0; while (nb_read > 0) { int tmp; - memset(buf, 0, sizeof(char) * (1024 + 1)); - for (n = 0; n < 1024 && (nb_read = read(fd, &c, sizeof(char))) == sizeof(char) && c != '\n'; n++) { + ini_lineno++; + ini_filename = filename; + for (n = 0; (nb_read = read(fd, &c, sizeof(char))) == sizeof(char) && c != '\n'; n++) { + if (n == bufsize) { + newbuf = (char*) realloc(buf, sizeof(char) * (bufsize + 1024 + 1)); + if (newbuf == NULL) { + ini_recursion--; + close(fd); + free(buf); + return -1; + } + buf = newbuf; + memset(buf + ((bufsize + 1) * sizeof(char)), 0, sizeof(char) * 1024); + bufsize += 1024; + } + buf[n] = c; } + if (n == 0) { + continue; + } buf[n++] = '\n'; - ini_lineno++; - ini_filename = filename; tmp = zend_parse_ini_string(buf, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t)fpm_conf_ini_parser, &error TSRMLS_CC); ini_filename = filename; if (error || tmp == FAILURE) { if (ini_include) free(ini_include); ini_recursion--; close(fd); + free(buf); return -1; } if (ini_include) { @@ -1516,11 +1533,14 @@ int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ free(tmp); ini_recursion--; close(fd); + free(buf); return -1; } free(tmp); } + memset(buf, 0, sizeof(char) * (bufsize + 1)); } + free(buf); ini_recursion--; close(fd);