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