From b8466723cd0e43e63b15b49ca506528e3151db5a Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Sat, 24 Dec 2011 21:50:53 +0000 Subject: [PATCH] Beef up VG_(strerror) to provide correct messages for the errno codes in asm-generic/errno-base.h (on linux). The error strings were obtained by calling strerror natively in Linux. Extend vki-linux.h accordingly. vki-darwin.h already had those errno codes. Add testcase. This fixes #287858. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12316 --- NEWS | 2 +- coregrind/m_syscall.c | 55 ++++++++++++++++++++++++++----------- include/vki/vki-linux.h | 29 ++++++++++++++++--- none/tests/Makefile.am | 1 + none/tests/nodir.stderr.exp | 1 + none/tests/nodir.vgtest | 1 + 6 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 none/tests/nodir.stderr.exp create mode 100644 none/tests/nodir.vgtest diff --git a/NEWS b/NEWS index b5eb516a4..0d907b542 100644 --- a/NEWS +++ b/NEWS @@ -28,7 +28,7 @@ where XXXXXX is the bug number as listed below. 283413 Fix wrong sanity check 286270 vgpreload is not friendly to 64->32 bit execs, gives ld.so warnings 286374 Running cachegrind with --branch-sim=yes on 64-bit PowerPC program fails - +287858 VG_(strerror): unknown error Release 3.7.0 (5 November 2011) diff --git a/coregrind/m_syscall.c b/coregrind/m_syscall.c index fc06c25ab..ae9630f7a 100644 --- a/coregrind/m_syscall.c +++ b/coregrind/m_syscall.c @@ -695,28 +695,51 @@ SysRes VG_(do_syscall) ( UWord sysno, UWord a1, UWord a2, UWord a3, const HChar* VG_(strerror) ( UWord errnum ) { switch (errnum) { - case VKI_EPERM: return "Operation not permitted"; - case VKI_ENOENT: return "No such file or directory"; - case VKI_ESRCH: return "No such process"; - case VKI_EINTR: return "Interrupted system call"; - case VKI_EBADF: return "Bad file number"; - case VKI_EAGAIN: return "Try again"; - case VKI_ENOMEM: return "Out of memory"; - case VKI_EACCES: return "Permission denied"; - case VKI_EFAULT: return "Bad address"; - case VKI_EEXIST: return "File exists"; - case VKI_EINVAL: return "Invalid argument"; - case VKI_EMFILE: return "Too many open files"; - case VKI_ENOSYS: return "Function not implemented"; - case VKI_EOVERFLOW: return "Value too large for defined data type"; + case VKI_EPERM: return "Operation not permitted"; + case VKI_ENOENT: return "No such file or directory"; + case VKI_ESRCH: return "No such process"; + case VKI_EINTR: return "Interrupted system call"; + case VKI_EIO: return "Input/output error"; + case VKI_ENXIO: return "No such device or address"; + case VKI_E2BIG: return "Argument list too long"; + case VKI_ENOEXEC: return "Exec format error"; + case VKI_EBADF: return "Bad file descriptor"; + case VKI_ECHILD: return "No child processes"; + case VKI_EAGAIN: return "Resource temporarily unavailable"; + case VKI_ENOMEM: return "Cannot allocate memory"; + case VKI_EACCES: return "Permission denied"; + case VKI_EFAULT: return "Bad address"; + case VKI_ENOTBLK: return "Block device required"; + case VKI_EBUSY: return "Device or resource busy"; + case VKI_EEXIST: return "File exists"; + case VKI_EXDEV: return "Invalid cross-device link"; + case VKI_ENODEV: return "No such device"; + case VKI_ENOTDIR: return "Not a directory"; + case VKI_EISDIR: return "Is a directory"; + case VKI_EINVAL: return "Invalid argument"; + case VKI_ENFILE: return "Too many open files in system"; + case VKI_EMFILE: return "Too many open files"; + case VKI_ENOTTY: return "Inappropriate ioctl for device"; + case VKI_ETXTBSY: return "Text file busy"; + case VKI_EFBIG: return "File too large"; + case VKI_ENOSPC: return "No space left on device"; + case VKI_ESPIPE: return "Illegal seek"; + case VKI_EROFS: return "Read-only file system"; + case VKI_EMLINK: return "Too many links"; + case VKI_EPIPE: return "Broken pipe"; + case VKI_EDOM: return "Numerical argument out of domain"; + case VKI_ERANGE: return "Numerical result out of range"; + + case VKI_ENOSYS: return "Function not implemented"; + case VKI_EOVERFLOW: return "Value too large for defined data type"; # if defined(VKI_ERESTARTSYS) case VKI_ERESTARTSYS: return "ERESTARTSYS"; # endif - default: return "VG_(strerror): unknown error"; + default: return "VG_(strerror): unknown error"; } } /*--------------------------------------------------------------------*/ -/*--- end ---*/ +/*--- end ---*/ /*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index a53d523f7..6763b13a6 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -1158,22 +1158,43 @@ struct vki_seminfo { #define VKI_ENOENT 2 /* No such file or directory */ #define VKI_ESRCH 3 /* No such process */ #define VKI_EINTR 4 /* Interrupted system call */ -#define VKI_ENOEXEC 8 /* Exec format error */ +#define VKI_EIO 5 /* I/O error */ +#define VKI_ENXIO 6 /* No such device or address */ +#define VKI_E2BIG 7 /* Argument list too long */ +#define VKI_ENOEXEC 8 /* Exec format error */ #define VKI_EBADF 9 /* Bad file number */ -#define VKI_ECHILD 10 /* No child processes */ -#define VKI_EAGAIN 11 /* Try again */ -#define VKI_EWOULDBLOCK VKI_EAGAIN +#define VKI_ECHILD 10 /* No child processes */ +#define VKI_EAGAIN 11 /* Try again */ #define VKI_ENOMEM 12 /* Out of memory */ #define VKI_EACCES 13 /* Permission denied */ #define VKI_EFAULT 14 /* Bad address */ +#define VKI_ENOTBLK 15 /* Block device required */ +#define VKI_EBUSY 16 /* Device or resource busy */ #define VKI_EEXIST 17 /* File exists */ +#define VKI_EXDEV 18 /* Cross-device link */ +#define VKI_ENODEV 19 /* No such device */ +#define VKI_ENOTDIR 20 /* Not a directory */ +#define VKI_EISDIR 21 /* Is a directory */ #define VKI_EINVAL 22 /* Invalid argument */ +#define VKI_ENFILE 23 /* File table overflow */ #define VKI_EMFILE 24 /* Too many open files */ +#define VKI_ENOTTY 25 /* Not a typewriter */ +#define VKI_ETXTBSY 26 /* Text file busy */ +#define VKI_EFBIG 27 /* File too large */ +#define VKI_ENOSPC 28 /* No space left on device */ +#define VKI_ESPIPE 29 /* Illegal seek */ +#define VKI_EROFS 30 /* Read-only file system */ +#define VKI_EMLINK 31 /* Too many links */ +#define VKI_EPIPE 32 /* Broken pipe */ +#define VKI_EDOM 33 /* Math argument out of domain of func */ +#define VKI_ERANGE 34 /* Math result not representable */ //---------------------------------------------------------------------- // From linux-2.6.8.1/include/asm-generic/errno.h //---------------------------------------------------------------------- +#define VKI_EWOULDBLOCK VKI_EAGAIN + #define VKI_ENOSYS 38 /* Function not implemented */ #define VKI_EOVERFLOW 75 /* Value too large for defined data type */ diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am index 13e889212..49350c763 100644 --- a/none/tests/Makefile.am +++ b/none/tests/Makefile.am @@ -99,6 +99,7 @@ EXTRA_DIST = \ mq.stderr.exp mq.vgtest \ munmap_exe.stderr.exp munmap_exe.vgtest \ nestedfns.stderr.exp nestedfns.stdout.exp nestedfns.vgtest \ + nodir.stderr.exp nodir.vgtest \ pending.stdout.exp pending.stderr.exp pending.vgtest \ procfs-linux.stderr.exp-with-readlinkat \ procfs-linux.stderr.exp-without-readlinkat \ diff --git a/none/tests/nodir.stderr.exp b/none/tests/nodir.stderr.exp new file mode 100644 index 000000000..d700ddb14 --- /dev/null +++ b/none/tests/nodir.stderr.exp @@ -0,0 +1 @@ +valgrind: ./nodir.vgtest/foobar: Not a directory diff --git a/none/tests/nodir.vgtest b/none/tests/nodir.vgtest new file mode 100644 index 000000000..57f36bcf8 --- /dev/null +++ b/none/tests/nodir.vgtest @@ -0,0 +1 @@ +prog: nodir.vgtest/foobar