[scponly] Re: scponly bug

joe joe at sublimation.org
Tue Sep 17 15:33:28 EDT 2002


It may be simplest to avoid possible differences in implementation and to
just to it "by hand" - realloc is sortof a shortcut to free, malloc,
memcpy anyway.  i'll go through the notes you sent more carefully and try
to come up with something reasonable.

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 14:26, joe wrote:
> >
> > 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
> > allocated.
> >
> > Better code looks like this:
> >
> >            if ((p2 = realloc(p, nsize)) == NULL) {
> >                    if (p)
> >                            free(p);
> >                    p = NULL;
> >                    return NULL;
> >            }
> >            p = p2;
> >
>
> Interesting.
>
> This is from the linux man page:
>
>        realloc()  changes the size of the memory block pointed to
>        by ptr to size bytes.  The contents will be  unchanged  to
>        the minimum of the old and new sizes; newly allocated mem-
>        ory will be uninitialized.  If ptr is NULL,  the  call  is
>        equivalent  to malloc(size); if size is equal to zero, the
>        call is equivalent to free(ptr).  Unless ptr is  NULL,  it
>        must  have  been  returned by an earlier call to malloc(),
>        calloc() or realloc().
>
> So if the linux man page is correct, I see no other way to read it
> except to believe that if newlen is zero, then outbuf has already been
> freed and calling free again will result in a memory violation.
>
> Note that the invocation of realloc does not change the value of outbuf
> (ever), unless it modifies its args (hmmm...maybe it does). So if newlen
> is zero, outbuf still has a value and freeing that value will be a
> violation. In other words, unless realloc changes its args, then you
> cannot test against its value after the realloc. You might be able to
> test against the contents of outbuf, if you can assume that those memory
> locations have been cleared, but I'm not sure you can assume that
> either.
>
> R&R says 'realloc returns a pointer to the NEW space' (emphasis mine).
> Which would seem to suggest that that the OepnBSD man page may be in
> error.
>
> At the very least, it does not appear that there is great agreement
> between the man pages. Have you look at POSIX or ANSI?
>
> --
> Karl DeBisschop <kdebisschop at alert.infoplease.com>
>
>




More information about the scponly mailing list