[scponly] Re: scponly bug

joe joe at sublimation.org
Tue Sep 17 12:26:58 EDT 2002


karl,

i'm not familiar with split, is it a source code analyzer?

regarding realloc, you're right that the free before the exit is probably
not neccesary, however, to explain the origin of this code, keep reading:

the original code in helper.c:
                if (NULL == (temp = realloc (outbuf, newlen)))
                {
                        perror("realloc");
                        if (outbuf)
                                free(outbuf);
                        exit(-1);
                }
                outbuf=temp;
                temp=NULL;

the openbsd realloc() manpage:
     When using realloc() one must be careful to avoid the following
idiom:

           if ((p = realloc(p, nsize)) == NULL)
                   return NULL;

     In most cases, this will result in a leak of memory.  As stated
earlier,
     a return value of NULL indicates that the old object still remains
allo-
     cated.  Better code looks like this:

           if ((p2 = realloc(p, nsize)) == NULL) {
                   if (p)
                           free(p);
                   p = NULL;
                   return NULL;
           }
           p = p2;


granted, the exit instead of the free makes this all a moot point.

also, the exit value of -1 is something i agree should be changed.  it
will be included in the next rev.

joe


----

PGP KEY: http://www.sublimation.org/contact.html
PGP Key fingerprint = EC4B 0DA5 B4F6 BDDD 9176 55D6 3A6A 7D63 158F 22D2


On 17 Sep 2002, Karl DeBisschop wrote:

> On Tue, 2002-09-17 at 03:58, joe wrote:
>
> > > > On Mon, 16 Sep 2002, Zdenek Hladik wrote:
> > > >
> > > > > But more serious problem i got. At first I believed that i made wrong
> > > > > chroot jail, but after adding some debug messages to scponly.c i
> > > > > found that scponlyc crashes inside
> > > > >
> > > > >        flatten_vector()
> > > > >
> > > > > on processing of scp -r -p -d "somefile" command from winscp. with
> > > > > exit signal 11 (memory violation).
>
> splint flags the following code as a use of already freed memory:
>
> 		if (NULL == (temp = realloc (outbuf, newlen)))
> 		{
> 			perror("realloc");
> 			if (outbuf)
> 				free(outbuf);
> 			exit(-1);
> 		}
>
> I think it is right. I think of it like this: realloc takes an existing
> memory segment, and hands you a new segmant of the requested size,
> preserving the contents of the old segment if it fits within the length
> of the returned memory space (which may or may not start at the same
> point as the old pointer). So outbuf is actually freed by realloc.
>
> Now it could be that I'm not uderstanding it fully, but if the logic
> above (and the splint output) are correct, then
>
> 		if (NULL == (temp = realloc (outbuf, newlen)))
> 		{
> 			perror("realloc");
> 			exit(-1);
> 		}
>
> is the correct code.
>
> Even if there's argument about whether or not it's correct, omitting the
> free() does clear up the splint error, and since the next call is to
> exit(), there would be no real consequence to leaving outbuf unfreed.
>
> --
> Karl DeBisschop <kdebisschop at alert.infoplease.com>
>
>




More information about the scponly mailing list