]> granicus.if.org Git - procps-ng/commitdiff
Preload sysctl lines even if longer than stdio buffer
authorWerner Fink <werner@suse.de>
Thu, 18 Jan 2018 10:06:55 +0000 (11:06 +0100)
committerCraig Small <csmall@enc.com.au>
Thu, 1 Mar 2018 10:39:46 +0000 (21:39 +1100)
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 <werner@suse.de>
sysctl.c

index 9356910f91fff8f3df2ea73af0f19c38757c0c45..54988a569097bb82addc9ce5367a67323f870900 100644 (file)
--- 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;
 }