]> granicus.if.org Git - php/commitdiff
Allow unlimited line length in fpm config files
authorChris Wright <chrisw@networkm.co.uk>
Mon, 21 Oct 2013 11:01:27 +0000 (12:01 +0100)
committerChris Wright <chrisw@networkm.co.uk>
Mon, 28 Oct 2013 09:35:01 +0000 (09:35 +0000)
Fixes bug #65933

sapi/fpm/fpm/fpm_conf.c

index cd5fc34d0f2d0e7b80e11fb32e4314033c297d7a..743d4ff1c4a5cab73ce5b97329e847c11181ac05 100644 (file)
@@ -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);