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. 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) {