scripts/mod/modpost.c: fix memory leak
authorAlexey Fomenko <ext-alexey.fomenko@nokia.com>
Tue, 10 Aug 2010 00:20:24 +0000 (17:20 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 10 Aug 2010 03:45:05 +0000 (20:45 -0700)
sec2annotation returns malloc'ed buffer directly to printf as an argument.
 Free this buffer after printing.

Signed-off-by: Alexey Fomenko <ext-alexey.fomenko@nokia.com>
Cc: Trevor Keith <tsrk@tsrk.net>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Michal Marek <mmarek@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
scripts/mod/modpost.c

index c827309c29cf727bae89d42a4b6e38164b9d72a7..1ce655dde99efd4357db4b62b1a9ff98f0d8fadd 100644 (file)
@@ -1245,6 +1245,8 @@ static void report_sec_mismatch(const char *modname,
 {
        const char *from, *from_p;
        const char *to, *to_p;
 {
        const char *from, *from_p;
        const char *to, *to_p;
+       char *prl_from;
+       char *prl_to;
 
        switch (from_is_func) {
        case 0: from = "variable"; from_p = "";   break;
 
        switch (from_is_func) {
        case 0: from = "variable"; from_p = "";   break;
@@ -1268,16 +1270,21 @@ static void report_sec_mismatch(const char *modname,
 
        switch (mismatch->mismatch) {
        case TEXT_TO_ANY_INIT:
 
        switch (mismatch->mismatch) {
        case TEXT_TO_ANY_INIT:
+               prl_from = sec2annotation(fromsec);
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The function %s%s() references\n"
                "the %s %s%s%s.\n"
                "This is often because %s lacks a %s\n"
                "annotation or the annotation of %s is wrong.\n",
                fprintf(stderr,
                "The function %s%s() references\n"
                "the %s %s%s%s.\n"
                "This is often because %s lacks a %s\n"
                "annotation or the annotation of %s is wrong.\n",
-               sec2annotation(fromsec), fromsym,
-               to, sec2annotation(tosec), tosym, to_p,
-               fromsym, sec2annotation(tosec), tosym);
+               prl_from, fromsym,
+               to, prl_to, tosym, to_p,
+               fromsym, prl_to, tosym);
+               free(prl_from);
+               free(prl_to);
                break;
        case DATA_TO_ANY_INIT: {
                break;
        case DATA_TO_ANY_INIT: {
+               prl_to = sec2annotation(tosec);
                const char *const *s = mismatch->symbol_white_list;
                fprintf(stderr,
                "The variable %s references\n"
                const char *const *s = mismatch->symbol_white_list;
                fprintf(stderr,
                "The variable %s references\n"
@@ -1285,20 +1292,24 @@ static void report_sec_mismatch(const char *modname,
                "If the reference is valid then annotate the\n"
                "variable with __init* or __refdata (see linux/init.h) "
                "or name the variable:\n",
                "If the reference is valid then annotate the\n"
                "variable with __init* or __refdata (see linux/init.h) "
                "or name the variable:\n",
-               fromsym, to, sec2annotation(tosec), tosym, to_p);
+               fromsym, to, prl_to, tosym, to_p);
                while (*s)
                        fprintf(stderr, "%s, ", *s++);
                fprintf(stderr, "\n");
                while (*s)
                        fprintf(stderr, "%s, ", *s++);
                fprintf(stderr, "\n");
+               free(prl_to);
                break;
        }
        case TEXT_TO_ANY_EXIT:
                break;
        }
        case TEXT_TO_ANY_EXIT:
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The function %s() references a %s in an exit section.\n"
                "Often the %s %s%s has valid usage outside the exit section\n"
                "and the fix is to remove the %sannotation of %s.\n",
                fprintf(stderr,
                "The function %s() references a %s in an exit section.\n"
                "Often the %s %s%s has valid usage outside the exit section\n"
                "and the fix is to remove the %sannotation of %s.\n",
-               fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym);
+               fromsym, to, to, tosym, to_p, prl_to, tosym);
+               free(prl_to);
                break;
        case DATA_TO_ANY_EXIT: {
                break;
        case DATA_TO_ANY_EXIT: {
+               prl_to = sec2annotation(tosec);
                const char *const *s = mismatch->symbol_white_list;
                fprintf(stderr,
                "The variable %s references\n"
                const char *const *s = mismatch->symbol_white_list;
                fprintf(stderr,
                "The variable %s references\n"
@@ -1306,24 +1317,31 @@ static void report_sec_mismatch(const char *modname,
                "If the reference is valid then annotate the\n"
                "variable with __exit* (see linux/init.h) or "
                "name the variable:\n",
                "If the reference is valid then annotate the\n"
                "variable with __exit* (see linux/init.h) or "
                "name the variable:\n",
-               fromsym, to, sec2annotation(tosec), tosym, to_p);
+               fromsym, to, prl_to, tosym, to_p);
                while (*s)
                        fprintf(stderr, "%s, ", *s++);
                fprintf(stderr, "\n");
                while (*s)
                        fprintf(stderr, "%s, ", *s++);
                fprintf(stderr, "\n");
+               free(prl_to);
                break;
        }
        case XXXINIT_TO_SOME_INIT:
        case XXXEXIT_TO_SOME_EXIT:
                break;
        }
        case XXXINIT_TO_SOME_INIT:
        case XXXEXIT_TO_SOME_EXIT:
+               prl_from = sec2annotation(fromsec);
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
                "If %s is only used by %s then\n"
                "annotate %s with a matching annotation.\n",
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
                "If %s is only used by %s then\n"
                "annotate %s with a matching annotation.\n",
-               from, sec2annotation(fromsec), fromsym, from_p,
-               to, sec2annotation(tosec), tosym, to_p,
+               from, prl_from, fromsym, from_p,
+               to, prl_to, tosym, to_p,
                tosym, fromsym, tosym);
                tosym, fromsym, tosym);
+               free(prl_from);
+               free(prl_to);
                break;
        case ANY_INIT_TO_ANY_EXIT:
                break;
        case ANY_INIT_TO_ANY_EXIT:
+               prl_from = sec2annotation(fromsec);
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
@@ -1332,11 +1350,15 @@ static void report_sec_mismatch(const char *modname,
                "uses functionality in the exit path.\n"
                "The fix is often to remove the %sannotation of\n"
                "%s%s so it may be used outside an exit section.\n",
                "uses functionality in the exit path.\n"
                "The fix is often to remove the %sannotation of\n"
                "%s%s so it may be used outside an exit section.\n",
-               from, sec2annotation(fromsec), fromsym, from_p,
-               to, sec2annotation(tosec), tosym, to_p,
+               from, prl_from, fromsym, from_p,
+               to, prl_to, tosym, to_p,
                sec2annotation(tosec), tosym, to_p);
                sec2annotation(tosec), tosym, to_p);
+               free(prl_from);
+               free(prl_to);
                break;
        case ANY_EXIT_TO_ANY_INIT:
                break;
        case ANY_EXIT_TO_ANY_INIT:
+               prl_from = sec2annotation(fromsec);
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
                fprintf(stderr,
                "The %s %s%s%s references\n"
                "a %s %s%s%s.\n"
@@ -1345,16 +1367,20 @@ static void report_sec_mismatch(const char *modname,
                "uses functionality in the init path.\n"
                "The fix is often to remove the %sannotation of\n"
                "%s%s so it may be used outside an init section.\n",
                "uses functionality in the init path.\n"
                "The fix is often to remove the %sannotation of\n"
                "%s%s so it may be used outside an init section.\n",
-               from, sec2annotation(fromsec), fromsym, from_p,
-               to, sec2annotation(tosec), tosym, to_p,
-               sec2annotation(tosec), tosym, to_p);
+               from, prl_from, fromsym, from_p,
+               to, prl_to, tosym, to_p,
+               prl_to, tosym, to_p);
+               free(prl_from);
+               free(prl_to);
                break;
        case EXPORT_TO_INIT_EXIT:
                break;
        case EXPORT_TO_INIT_EXIT:
+               prl_to = sec2annotation(tosec);
                fprintf(stderr,
                "The symbol %s is exported and annotated %s\n"
                "Fix this by removing the %sannotation of %s "
                "or drop the export.\n",
                fprintf(stderr,
                "The symbol %s is exported and annotated %s\n"
                "Fix this by removing the %sannotation of %s "
                "or drop the export.\n",
-               tosym, sec2annotation(tosec), sec2annotation(tosec), tosym);
+               tosym, prl_to, prl_to, tosym);
+               free(prl_to);
                break;
        }
        fprintf(stderr, "\n");
                break;
        }
        fprintf(stderr, "\n");