> Good catch, thanks.
>
> My eyes glazed over a little while reviewing this, but tentative ok
> mmcc@
>
> Below is what I consider a better refactoring of buf_free(). It makes it
> NULL-safe and has more classic free function logic.
I didn't include buf_free() in my patch but that looks good.
> > Footnote:
> > I noticed that rcsnum_free() is just free() so maybe that could be
> > removed also (not included in this patch).
>
> I'll have to look, but this sounds like a good idea to me.
In rcs(1) rcsnum_free() is more complicated since rn_id is dynamically
allocated.
> Index: buf.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/cvs/buf.c,v
> retrieving revision 1.82
> diff -u -p -r1.82 buf.c
> --- buf.c 5 Feb 2015 12:59:57 -0000 1.82
> +++ buf.c 5 Nov 2015 05:08:57 -0000
> @@ -119,15 +119,15 @@ buf_load_fd(int fd)
> void
> buf_free(BUF *b)
> {
> - if (b->cb_buf != NULL)
> - xfree(b->cb_buf);
> - xfree(b);
> + if (b != NULL) {
> + free(b->cb_buf);
> + free(b);
> + }
> }
>
> /*
> * Free the buffer <b>'s structural information but do not free the contents
> - * of the buffer. Instead, they are returned and should be freed later using
> - * xfree().
> + * of the buffer. Instead, they are returned and should be freed later.
> */
> void *
> buf_release(BUF *b)
> @@ -135,7 +135,7 @@ buf_release(BUF *b)
> void *tmp;
>
> tmp = b->cb_buf;
> - xfree(b);
> + free(b);
> return (tmp);
> }
>