initcalls: Fix m68k build and possible buffer overflow
authorCyrill Gorcunov <gorcunov@gmail.com>
Thu, 15 May 2008 20:52:41 +0000 (13:52 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 May 2008 01:20:06 +0000 (18:20 -0700)
This patch fixes a build bug on m68k - gcc decides to emit a call to the
strlen library function, which we don't implement.

More importantly - my previous patch "init: don't lose initcall return
values" (commit e662e1cfd434aa234b72fbc781f1d70211cb785b) had introduced
potential buffer overflow by wrong calculation of string accumulator
size.

Use strlcat() instead, fixing both bugs.

Many thanks Andreas Schwab and Geert Uytterhoeven for helping
to catch and fix the bug.

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
init/main.c

index b8bcf6da8a772715119b21a7c9b29d931de2fa1a..f7fb20021d48d5a4a175cc79d84f6b3cfb9eab53 100644 (file)
@@ -697,7 +697,7 @@ static void __init do_one_initcall(initcall_t fn)
 {
        int count = preempt_count();
        ktime_t t0, t1, delta;
-       char msgbuf[40];
+       char msgbuf[64];
        int result;
 
        if (initcall_debug) {
@@ -722,11 +722,11 @@ static void __init do_one_initcall(initcall_t fn)
                sprintf(msgbuf, "error code %d ", result);
 
        if (preempt_count() != count) {
-               strncat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
+               strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
                preempt_count() = count;
        }
        if (irqs_disabled()) {
-               strncat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
+               strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
                local_irq_enable();
        }
        if (msgbuf[0]) {