From: Valentine Krasnobaeva Date: Wed, 7 Aug 2024 14:31:25 +0000 (+0200) Subject: MINOR: cfgparse: load_cfg_in_mem: take in account file size X-Git-Tag: v3.1-dev5~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03e63b98ca1bb9c3b706eac01529c3834917a10f;p=thirdparty%2Fhaproxy.git MINOR: cfgparse: load_cfg_in_mem: take in account file size Let's take in account the given file size, when its reported via stat. It's very convenient for large configuration files, as this allows to perform only the one memory allocation call for precisely needeed file size. This also allows to perform only the one call to fread(). We need to provide to fread() file_stat.st_size + 1 to be able to grab EOF. Like this it sets feof(f)=1 flag and this allows to exit from the loop immediately, just after fread call. If /dev/stdin or /dev/null is provided as a file, we continue to read the configuration chunk by chunk, stat doesn't report the size. --- diff --git a/src/cfgparse.c b/src/cfgparse.c index bbaab76366..a5dcf7aaf6 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1759,10 +1759,23 @@ ssize_t load_cfg_in_mem(char *filename, char **cfg_content) size_t bytes_to_read = LINESIZE; size_t chunk_size = 0; size_t read_bytes = 0; + struct stat file_stat; char *new_area; size_t ret = 0; FILE *f; + /* let's try to obtain the size, if regular file */ + if (stat(filename, &file_stat) != 0) { + ha_alert("stat() failed for configuration file %s : %s\n", + filename, strerror(errno)); + return -1; + } + + if (file_stat.st_size) { + /* as we need to read EOF to have feof(f)=1 */ + bytes_to_read = file_stat.st_size + 1; + } + if ((f = fopen(filename,"r")) == NULL) { ha_alert("Could not open configuration file %s : %s\n", filename, strerror(errno));