diff options
author | Jeff Moyer <jmoyer@redhat.com> | 2018-01-12 10:53:15 -0500 |
---|---|---|
committer | Jeff Moyer <jmoyer@redhat.com> | 2018-01-12 11:35:37 -0500 |
commit | b112f6b45d995043614dd79e032753b0741c86d2 (patch) | |
tree | d29370907aed9854ba06fc5787d6acd7bac5c7c4 | |
parent | a6f4056fbc921382e2be7d09758b6fd37430b484 (diff) | |
download | libaio-b112f6b45d995043614dd79e032753b0741c86d2.tar.gz |
syscall-generic: don't overwrite errno
The io_* system calls should not touch errno. Fix it.
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
-rw-r--r-- | src/syscall-generic.h | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/syscall-generic.h b/src/syscall-generic.h index 24d7c7c..44d57f3 100644 --- a/src/syscall-generic.h +++ b/src/syscall-generic.h @@ -2,10 +2,16 @@ #include <unistd.h> #include <sys/syscall.h> -#define _body_io_syscall(sname, args...) \ -{ \ - int ret = syscall(__NR_##sname, ## args); \ - return ret < 0 ? -errno : ret; \ +#define _body_io_syscall(sname, args...) \ +{ \ + int ret, saved_errno; \ + saved_errno = errno; \ + ret= syscall(__NR_##sname, ## args); \ + if (ret < 0) { \ + ret = -errno; \ + errno = saved_errno; \ + } \ + return ret; \ } #define io_syscall1(type,fname,sname,type1,arg1) \ |