From: Werner Fink Date: Thu, 18 Jan 2018 10:06:55 +0000 (+0100) Subject: Preload sysctl lines even if longer than stdio buffer X-Git-Tag: v4.0.0~641 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1ca49b93d225fe91576d2f37306317f0c7d2abed;p=procps-ng Preload sysctl lines even if longer than stdio buffer by using getline(3) to use a dynamically increased buffer if required by the input found in sysctl configuration files. Signed-off-by: Werner Fink --- diff --git a/sysctl.c b/sysctl.c index 9356910f..54988a56 100644 --- a/sysctl.c +++ b/sysctl.c @@ -509,18 +509,21 @@ static int pattern_match(const char *string, const char *pat) */ static int Preload(const char *restrict const filename) { - char oneline[LINELEN]; - char buffer[LINELEN]; + char *oneline; FILE *fp; char *t; int n = 0; int rc = 0; + size_t blen = LINELEN; + ssize_t rlen; char *name, *value; glob_t globbuf; int globerr; int globflg; int j; + oneline = xmalloc(blen); + globflg = GLOB_NOCHECK; #ifdef GLOB_BRACE globflg |= GLOB_BRACE; @@ -542,13 +545,19 @@ static int Preload(const char *restrict const filename) ? stdin : fopen(globbuf.gl_pathv[j], "r"); if (!fp) { xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]); - return -1; + rc = -1; + goto out; } - while (fgets(oneline, sizeof oneline, fp)) { + while ((rlen = getline(&oneline, &blen, fp)) != -1) { + size_t offset; + n++; - t = StripLeadingAndTrailingSpaces(oneline); + if (rlen < 2) + continue; + + t = StripLeadingAndTrailingSpaces(oneline); if (strlen(t) < 2) continue; @@ -567,6 +576,10 @@ static int Preload(const char *restrict const filename) if (pattern && !pattern_match(name, pattern)) continue; + offset = strlen(name); + memmove(&oneline[0], name, offset); + oneline[offset++] = '='; + value = strtok(NULL, "\n\r"); if (!value || !*value) { xwarnx(_("%s(%d): invalid syntax, continuing..."), @@ -578,12 +591,16 @@ static int Preload(const char *restrict const filename) value++; /* should NameOnly affect this? */ - sprintf(buffer, "%s=%s", name, value); - rc |= WriteSetting(buffer); + memmove(&oneline[offset], value, strlen(value)); + offset += strlen(value); + oneline[offset] = '\0'; + + rc |= WriteSetting(oneline); } fclose(fp); } +out: return rc; }