From: Stefan Beller Date: Wed, 19 Nov 2014 01:41:17 GMT Subject: Re: [PATCH 1/4] error: save and restore errno Message-ID: In-Reply-To: <20141119013710.GA2135@peff.net> This one makes my day. A really good fix as it minimizes maintenance burden for checking incoming patches for that pattern. Reviewed-by: Stefan Beller On Tue, Nov 18, 2014 at 5:37 PM, Jeff King wrote: > It's common to use error() to return from a function, like: > > if (open(...) < 0) > return error("open failed"); > > Unfortunately this may clobber the errno from the open() > call. So we often end up with code like this: > > if (open(...) < 0) { > int saved_errno = errno; > error("open failed"); > errno = saved_errno; > return -1; > } > > which is less nice. Let's teach error() to save and restore > errno in each call, so that the original errno is preserved. > This is slightly less efficient for callers which do not > care, but error code paths are generally not performance > critical anyway. > > Signed-off-by: Jeff King > --- > It's pretty minor to just handle errno in the callers, but I feel like > I've wanted this at least a dozen times, and it seems like it cannot > possibly hurt (i.e., I imagine there are callers where we _should_ be > doing the errno dance but have not realized it). > > usage.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/usage.c b/usage.c > index ed14645..ee44d57 100644 > --- a/usage.c > +++ b/usage.c > @@ -142,10 +142,13 @@ void NORETURN die_errno(const char *fmt, ...) > int error(const char *err, ...) > { > va_list params; > + int saved_errno = errno; > > va_start(params, err); > error_routine(err, params); > va_end(params); > + > + errno = saved_errno; > return -1; > } > > -- > 2.1.2.596.g7379948 >