]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib/clippy: bail out on newline inside string 13108/head
authorDavid Lamparter <equinox@opensourcerouting.org>
Sat, 25 Mar 2023 03:34:35 +0000 (12:34 +0900)
committerDavid Lamparter <equinox@opensourcerouting.org>
Sat, 25 Mar 2023 03:34:35 +0000 (12:34 +0900)
While C compilers will generally process strings across lines, we really
don't want that.  I rather treat this as the indication of the typo it
probably is warn about it than support this odd C edge case.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
lib/defun_lex.l

index 81ae497cf17633179bd551290914d992f8985be9..124f864166f0d7127697f897f6169a6fa3200774 100644 (file)
@@ -53,6 +53,7 @@ int comment_link;
 char string_end;
 
 char *value;
+static const char *yyfilename;
 
 static void extendbuf(char **what, const char *arg)
 {
@@ -119,8 +120,17 @@ SPECIAL            [(),]
                                        }
                                }
 <rstring>\\\n                  /* ignore */
+<rstring>\n                    {
+                                       fprintf(stderr,
+                                               "%s:%d: string continues past the end of the line\n",
+                                               yyfilename, yylineno);
+                                       free(value);
+                                       value = NULL;
+                                       BEGIN(INITIAL);
+                                       return STRING;
+                               }
 <rstring>\\.                   extend(yytext);
-<rstring>[^\\\"\']+            extend(yytext);
+<rstring>[^\\\"\'\n]+          extend(yytext);
 
 "DEFUN"                                value = strdup(yytext); return DEFUNNY;
 "DEFUN_NOSH"                   value = strdup(yytext); return DEFUNNY;
@@ -235,6 +245,7 @@ PyObject *clippy_parse(PyObject *self, PyObject *args)
        int token;
        yyin = fd;
        value = NULL;
+       yyfilename = filename;
 
        PyObject *pyCont = PyDict_New();
        PyObject *pyObj = PyList_New(0);
@@ -252,6 +263,7 @@ PyObject *clippy_parse(PyObject *self, PyObject *args)
                        if (!pyArgs) {
                                free(tval);
                                Py_DECREF(pyCont);
+                               yyfilename = NULL;
                                return NULL;
                        }
                        pyItem = PyDict_New();
@@ -280,5 +292,6 @@ PyObject *clippy_parse(PyObject *self, PyObject *args)
        }
        def_yylex_destroy();
        fclose(fd);
+       yyfilename = NULL;
        return pyCont;
 }