Le Thursday 07 Nov 2013 à 20:10:29 (+0100), Max Reitz a écrit : > There may be calls to error_setg() and especially error_setg_errno() > which blindly (and until now wrongly) assume these functions not to > clobber errno (e.g., they pass errno to error_setg_errno() and return > -errno afterwards). Instead of trying to find and fix all of these > constructs, just make sure error_setg() and error_setg_errno() indeed do > not clobber errno. > > Suggested-by: Eric Blake <ebl...@redhat.com> > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > util/error.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/util/error.c b/util/error.c > index ec0faa6..3ee362a 100644 > --- a/util/error.c > +++ b/util/error.c > @@ -27,6 +27,7 @@ void error_set(Error **errp, ErrorClass err_class, const > char *fmt, ...) > { > Error *err; > va_list ap; > + int saved_errno = errno; > > if (errp == NULL) { > return; > @@ -41,6 +42,8 @@ void error_set(Error **errp, ErrorClass err_class, const > char *fmt, ...) > err->err_class = err_class; > > *errp = err; > + > + errno = saved_errno; > } > > void error_set_errno(Error **errp, int os_errno, ErrorClass err_class, > @@ -49,6 +52,7 @@ void error_set_errno(Error **errp, int os_errno, ErrorClass > err_class, > Error *err; > char *msg1; > va_list ap; > + int saved_errno = errno; > > if (errp == NULL) { > return; > @@ -69,6 +73,8 @@ void error_set_errno(Error **errp, int os_errno, ErrorClass > err_class, > err->err_class = err_class; > > *errp = err; > + > + errno = saved_errno; > } > > void error_setg_file_open(Error **errp, int os_errno, const char *filename) > -- > 1.8.4.2 > >
Yes this look better than trying to fix all callers. Reviewed-by: Benoit Canet <ben...@irqsave.net