Web lists-archives.com

Re: [PATCH] strbuf: clear errno before calling getdelim(3)

René Scharfe <l.s.r@xxxxxx> writes:

> getdelim(3) returns -1 at the end of the file and if it encounters an
> error, but sets errno only in the latter case.  Set errno to zero before
> calling it to avoid misdiagnosing an out-of-memory condition due to a
> left-over value from some other function call.
> Reported-by: Yaroslav Halchenko <yoh@xxxxxxxxxxxxxx>
> Suggested-by: Junio C Hamano <gitster@xxxxxxxxx>
> Signed-off-by: Rene Scharfe <l.s.r@xxxxxx>

Heh.  I mumble something vague then people more capable than me jump
in to take it to the conclusion, and still I get the credit.  I wish
all the debugging sessions were this easy ;-)

> ---
> Do we need to save and restore the original value of errno?  I doubt it,
> but didn't think deeply about it, yet.

We probably don't need to---a caller who knows it got an error
before calling this function and wants to use errno after doing so
should be stashing it away; after all, this function will clobber
errno when any of the library calls it makes fails and this is on
the I/O codepath, so anything can go wrong.


>  strbuf.c | 1 +
>  1 file changed, 1 insertion(+)
> diff --git a/strbuf.c b/strbuf.c
> index 89d22e3b09..323c49ceb3 100644
> --- a/strbuf.c
> +++ b/strbuf.c
> @@ -476,6 +476,7 @@ int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
>  	/* Translate slopbuf to NULL, as we cannot call realloc on it */
>  	if (!sb->alloc)
>  		sb->buf = NULL;
> +	errno = 0;
>  	r = getdelim(&sb->buf, &sb->alloc, term, fp);
>  	if (r > 0) {