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 = '*';
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) {
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);