BusyBox 1.11.0 man patch for "cat"
Jason Curl
jcurlnews at arcor.de
Fri Jul 4 20:36:57 UTC 2008
Denys Vlasenko wrote:
> On Friday 04 July 2008 09:55, Jason Curl wrote:
>
>> Hello,
>>
>> I'd like to welcome comments on my first bb patch
>>
>
> It's using spaces for indentation. Otherwise looks ok.
>
OK, I'll fix this.
>
>> (it's the first I've needed to do since I've started
>> using 1.0.0). I like the new "man" applet, but it
>> needs nroff and gtbl. Unfortunately, I didn't prepare
>> the c++ compiler and the gnu tools won't compile.
>> No worry though, I've updated busybox to support
>> "cat" pages also. This requires less space than
>> installing all the GNU tools.
>>
>
> Ideally, some simplified replacement for nroff+gtbl
> would be cool.
>
I've seem to found a bug while testing man in a bit more detail. It
looks like the line
alloc_mp = 10;
/* this doesn't appear to initialise the array to NULL pointers */
man_path_list = xmalloc(10 * sizeof(man_path_list[0]));
count_mp = 0;
man_path_list[0] = xstrdup(getenv("MANPATH"));
doesn't initialise the array to zero in my case (indicating NULL
pointers). So as this array gets built up while parsing "/etc/man.conf"
it assumes that it was previously NULL.
if (strcmp("MANPATH", line) == 0) {
man_path_list[count_mp] = xstrdup(value);
count_mp++;
if (alloc_mp == count_mp) {
alloc_mp += 10;
man_path_list = xrealloc(man_path_list, alloc_mp
* sizeof(man_path_list[0]));
}
/* thus man_path_list is always NULL terminated */
That last comment doesn't seem to hold true.
Then the final while loop checks
while ((cur_path = man_path_list[cur_mp++]) != NULL) {
and it turns out that uninitialised data is compared against NULL which
fails, enters the loop again and dies with a segfault.
So the solution appears to be
if (cf) {
..
}
man_path_list[count_mp] = NULL;
This fixes my segfault.
> --
> vda
>
>
More information about the busybox
mailing list