René Scharfe <[email protected]> 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 <[email protected]>
> Suggested-by: Junio C Hamano <[email protected]>
> Signed-off-by: Rene Scharfe <[email protected]>
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.
Thanks.
>
> 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) {