Author: jah
Date: Mon Apr 27 05:35:26 2020
New Revision: 360368
URL: https://svnweb.freebsd.org/changeset/base/360368

Log:
  MFC r359815: config(8): use sbuf to manage line buffers

Modified:
  stable/12/usr.sbin/config/main.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.sbin/config/main.c
==============================================================================
--- stable/12/usr.sbin/config/main.c    Mon Apr 27 05:27:39 2020        
(r360367)
+++ stable/12/usr.sbin/config/main.c    Mon Apr 27 05:35:26 2020        
(r360368)
@@ -113,6 +113,8 @@ struct hdr_list {
        struct hdr_list *h_next;
 } *htab;
 
+static struct sbuf *line_buf = NULL;
+
 /*
  * Config builds a set of files for building a UNIX
  * system given a description of the desired system.
@@ -304,6 +306,29 @@ usage(void)
        exit(EX_USAGE);
 }
 
+static void
+init_line_buf(void)
+{
+       if (line_buf == NULL) {
+               line_buf = sbuf_new(NULL, NULL, 80, SBUF_AUTOEXTEND);
+               if (line_buf == NULL) {
+                       errx(EXIT_FAILURE, "failed to allocate line buffer");
+               }
+       } else {
+               sbuf_clear(line_buf);
+       }
+}
+
+static char *
+get_line_buf(void)
+{
+       if (sbuf_finish(line_buf) != 0) {
+               errx(EXIT_FAILURE, "failed to generate line buffer, "
+                   "partial line = %s", sbuf_data(line_buf));
+       }
+       return sbuf_data(line_buf);
+}
+
 /*
  * get_word
  *     returns EOF on end of file
@@ -313,11 +338,10 @@ usage(void)
 char *
 get_word(FILE *fp)
 {
-       static char line[160];
        int ch;
-       char *cp;
        int escaped_nl = 0;
 
+       init_line_buf();
 begin:
        while ((ch = getc(fp)) != EOF)
                if (ch != ' ' && ch != '\t')
@@ -336,29 +360,20 @@ begin:
                else
                        return (NULL);
        }
-       cp = line;
-       *cp++ = ch;
+       sbuf_putc(line_buf, ch);
        /* Negation operator is a word by itself. */
        if (ch == '!') {
-               *cp = 0;
-               return (line);
+               return get_line_buf();
        }
-       while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) {
+       while ((ch = getc(fp)) != EOF) {
                if (isspace(ch))
                        break;
-               *cp++ = ch;
+               sbuf_putc(line_buf, ch);
        }
-       if (cp >= line + sizeof(line)) {
-               line[sizeof(line) - 1] = '\0';
-               fprintf(stderr, "config: attempted overflow, partial line: 
`%s'",
-                   line);
-               exit(2);
-       }
-       *cp = 0;
        if (ch == EOF)
                return ((char *)EOF);
        (void) ungetc(ch, fp);
-       return (line);
+       return (get_line_buf());
 }
 
 /*
@@ -369,11 +384,10 @@ begin:
 char *
 get_quoted_word(FILE *fp)
 {
-       static char line[512];
        int ch;
-       char *cp;
        int escaped_nl = 0;
 
+       init_line_buf();
 begin:
        while ((ch = getc(fp)) != EOF)
                if (ch != ' ' && ch != '\t')
@@ -392,7 +406,6 @@ begin:
                else
                        return (NULL);
        }
-       cp = line;
        if (ch == '"' || ch == '\'') {
                int quote = ch;
 
@@ -401,9 +414,8 @@ begin:
                        if (ch == quote && !escaped_nl)
                                break;
                        if (ch == '\n' && !escaped_nl) {
-                               *cp = 0;
                                printf("config: missing quote reading `%s'\n",
-                                       line);
+                                       get_line_buf());
                                exit(2);
                        }
                        if (ch == '\\' && !escaped_nl) {
@@ -411,38 +423,23 @@ begin:
                                continue;
                        }
                        if (ch != quote && escaped_nl)
-                               *cp++ = '\\';
-                       if (cp >= line + sizeof(line)) {
-                               line[sizeof(line) - 1] = '\0';
-                               printf(
-                                   "config: line buffer overflow reading 
partial line `%s'\n",
-                                   line);
-                               exit(2);
-                       }
-                       *cp++ = ch;
+                               sbuf_putc(line_buf, '\\');
+                       sbuf_putc(line_buf, ch);
                        escaped_nl = 0;
                }
        } else {
-               *cp++ = ch;
-               while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) {
+               sbuf_putc(line_buf, ch);
+               while ((ch = getc(fp)) != EOF) {
                        if (isspace(ch))
                                break;
-                       *cp++ = ch;
+                       sbuf_putc(line_buf, ch);
                }
-               if (cp >= line + sizeof(line)) {
-                       line[sizeof(line) - 1] = '\0';
-                       printf(
-                           "config: line buffer overflow reading partial line 
`%s'\n",
-                           line);
-                       exit(2);
-               }
                if (ch != EOF)
                        (void) ungetc(ch, fp);
        }
-       *cp = 0;
        if (ch == EOF)
                return ((char *)EOF);
-       return (line);
+       return (get_line_buf());
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to