kconfig: detect recursive inclusion earlier
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 22 Mar 2018 17:00:13 +0000 (02:00 +0900)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 21:08:47 +0000 (22:08 +0100)
Currently, the recursive inclusion is not detected when the offending
file is about to be included; it is detected the offending file is
about to include the *next* file.  This is because the detection loop
does not involve the file being included.

Do this check against the file that is about to be included so that
the recursive inclusion is detected before unneeded parsing happens.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/zconf.l

index 0e8b892ba68303899890321b9c02341e166a4bae..64ec778f76f9609fb882ed6eb50182eaed08a825 100644 (file)
@@ -325,23 +325,25 @@ void zconf_nextfile(const char *name)
        buf->parent = current_buf;
        current_buf = buf;
 
        buf->parent = current_buf;
        current_buf = buf;
 
-       for (iter = current_file->parent; iter; iter = iter->parent ) {
-               if (!strcmp(current_file->name,iter->name) ) {
+       file->parent = current_file;
+
+       for (iter = current_file; iter; iter = iter->parent) {
+               if (!strcmp(iter->name, file->name)) {
                        fprintf(stderr,
                                "Recursive inclusion detected.\n"
                                "Inclusion path:\n"
                        fprintf(stderr,
                                "Recursive inclusion detected.\n"
                                "Inclusion path:\n"
-                               "  current file : %s\n", zconf_curname());
-                       iter = current_file;
+                               "  current file : %s\n", file->name);
+                       iter = file;
                        do {
                                iter = iter->parent;
                                fprintf(stderr, "  included from: %s:%d\n",
                                        iter->name, iter->lineno - 1);
                        do {
                                iter = iter->parent;
                                fprintf(stderr, "  included from: %s:%d\n",
                                        iter->name, iter->lineno - 1);
-                       } while (strcmp(iter->name, current_file->name));
+                       } while (strcmp(iter->name, file->name));
                        exit(1);
                }
        }
                        exit(1);
                }
        }
+
        file->lineno = 1;
        file->lineno = 1;
-       file->parent = current_file;
        current_file = file;
 }
 
        current_file = file;
 }