Posted by kecoak on Nov 16, 2009

Typo bugs fmtmsg() on FreeBSD!

FreeBSD hacker juga manusia :P. Hal tersebut terbukti pada sebuah kesalahan kecil yang dibuat oleh developer FreeBSD pada file /usr/src/lib/libc/gen/fmtmsg.c, khususnya yang ada pada fungsi printfmt().

01    /*
02     * Returns NULL on memory allocation failure, otherwise returns a pointer to
03     * a newly malloc()'d output buffer.
04     */
05    static char *
06    printfmt(char *msgverb, long class, const char *label, int sev,
07        const char *text, const char *act, const char *tag)
08    {
09            size_t size;
10            char *comp, *output;
11            const char *sevname;
12
13            size = 32;
14        ...
15            if (text != MM_NULLTXT)
16                    size += strlen(text);
17            if (text != MM_NULLACT)
18                    size += strlen(act);
19       ...
20            if ((output = malloc(size)) == NULL)
21       ...
22            return (output);
23    }

Seperti diketahui, fmtmsg adalah sebuah sebuah routines yang menghandle display message pada standard error dan atau system console. Berdasarkan manual page dari fmtmsg itu sendiri, kita bisa men-trigger bugs yang dimaksud dengan code sederhana seperti berikut:

#include 

int main(int argc, char * argv[])
{
fmtmsg(MM_UTIL | MM_PRINT, "BSD:ls", MM_ERROR,
"illegal option -- z", MM_NULLACT, "BSD:ls:001");
return 0;
}

dan hasilnya…

# gcc -o fmtbugs fmtbugs.c
# ./fmtbugs
Segmentation fault (core dumped)

Ok, kenapa bisa kondisi Segfault terjadi?. Hal tersebut terjadi karena pada saat variable “MM_NULLACT” di check apakah bernilai NULL atau tidak, developer FreeBSD ‘tidak sengaja’ mengambil argument ‘text’ yang pada contoh code diatas bernilai “illegal option — z” dan tentunya akan terjadi segmentation fault karena mengambil nilai yang salah. Seharusnya nilai yang diambil adalah argument ‘act’ yang pada contoh code diatas bernilai MM_NULLACT.

Info bugs ini di ambil dari link XORL blog dan FreeBSD Official site.

~jackD

Post a Comment

Leave a Reply

Your email address will not be published. Required fields are marked *