Re: [PATCH] strbuf: clear errno before calling getdelim(3)
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 10, 2017, 21:41 UTC
- Message-ID
- <xmqq378z2j8z.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <cd49ce13-db87-89c1-77e7-998fdb9442c3@web.de>
René Scharfe <l.s.r@web.de> writes:
Show 8 quoted lines
> 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@onerussian.com> > Suggested-by: Junio C Hamano <gitster@pobox.com> > Signed-off-by: Rene Scharfe <l.s.r@web.de>
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.
Show 16 quoted lines
>
> 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) {