]> 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>
Wed, 28 Feb 2018 09:46:58 +0000 (20:46 +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 7c05243d6c307d04dc47e16abeaf6ad87e05e2f4..42162f5b78afa74bd70bd91551e3acb9ee5eeaa7 100644 (file)
--- a/sysctl.c
+++ b/sysctl.c
@@ -511,18 +511,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;
@@ -544,13 +547,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;
 
@@ -569,6 +578,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..."),
@@ -580,12 +593,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;
 }