diff options
author | iraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2015-09-29 05:20:16 +0000 |
---|---|---|
committer | iraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2015-09-29 05:20:16 +0000 |
commit | 2d20d8d974914211ad308f00ced4743f369d730c (patch) | |
tree | 229061865d327f6ebb1ca0e4abe461104b6e696d | |
parent | 6150d3e63c6989aa7b6540ff75d6ae104ad3aa28 (diff) | |
download | valgrind-2d20d8d974914211ad308f00ced4743f369d730c.tar.gz |
Solaris ioctl: more wrappers for sockio ioctls.
SIOCGIFCONF, SIOCGIFFLAGS, SIOCGIFNETMASK, and SIOCGIFNUM.
n-i-bz
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15686 a5019735-40e9-0310-863c-91ae7b9d1cf9
-rw-r--r-- | coregrind/m_syswrap/syswrap-solaris.c | 56 | ||||
-rw-r--r-- | include/vki/vki-solaris.h | 6 | ||||
-rw-r--r-- | memcheck/tests/solaris/scalar_ioctl.c | 124 | ||||
-rw-r--r-- | memcheck/tests/solaris/scalar_ioctl.stderr.exp | 146 |
4 files changed, 331 insertions, 1 deletions
diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index a5bc37b69..36a03caa6 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -3154,6 +3154,36 @@ PRE(sys_ioctl) break; /* sockio */ + case VKI_SIOCGIFCONF: + { + struct vki_ifconf *p = (struct vki_ifconf *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGIFCONF, ifconf->ifc_len)", p->ifc_len); + PRE_FIELD_READ("ioctl(SIOCGIFCONF, ifconf->ifc_buf)", p->ifc_buf); + if (ML_(safe_to_deref)(p, sizeof(*p))) { + if ((p->ifc_buf != NULL) && (p->ifc_len > 0)) + PRE_MEM_WRITE("ioctl(SIOCGIFCONF, ifconf->ifc_buf)", + (Addr) p->ifc_buf, p->ifc_len); + } + /* ifc_len gets also written to during SIOCGIFCONF ioctl. */ + } + break; + case VKI_SIOCGIFFLAGS: + { + struct vki_ifreq *p = (struct vki_ifreq *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGIFFLAGS, ifreq->ifr_name)", p->ifr_name); + PRE_FIELD_WRITE("ioctl(SIOCGIFFLAGS, ifreq->ifr_flags)", p->ifr_flags); + } + break; + case VKI_SIOCGIFNETMASK: + { + struct vki_ifreq *p = (struct vki_ifreq *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGIFFLAGS, ifreq->ifr_name)", p->ifr_name); + PRE_FIELD_WRITE("ioctl(SIOCGIFFLAGS, ifreq->ifr_addr)", p->ifr_addr); + } + break; + case VKI_SIOCGIFNUM: + PRE_MEM_WRITE("ioctl(SIOCGIFNUM)", ARG3, sizeof(int)); + break; case VKI_SIOCGLIFNUM: { struct vki_lifnum *p = (struct vki_lifnum *) ARG3; @@ -3164,7 +3194,7 @@ PRE(sys_ioctl) PRE_FIELD_WRITE("ioctl(SIOCGLIFNUM, lifn->lifn_count)", p->lifn_count); } - break; + break; /* filio */ case VKI_FIOSETOWN: @@ -3321,6 +3351,30 @@ POST(sys_ioctl) break; /* sockio */ + case VKI_SIOCGIFCONF: + { + struct vki_ifconf *p = (struct vki_ifconf *) ARG3; + POST_FIELD_WRITE(p->ifc_len); + POST_FIELD_WRITE(p->ifc_req); + if ((p->ifc_req != NULL) && (p->ifc_len > 0)) + POST_MEM_WRITE((Addr) p->ifc_req, p->ifc_len); + } + break; + case VKI_SIOCGIFFLAGS: + { + struct vki_ifreq *p = (struct vki_ifreq *) ARG3; + POST_FIELD_WRITE(p->ifr_flags); + } + break; + case VKI_SIOCGIFNETMASK: + { + struct vki_ifreq *p = (struct vki_ifreq *) ARG3; + POST_FIELD_WRITE(p->ifr_addr); + } + break; + case VKI_SIOCGIFNUM: + POST_MEM_WRITE(ARG3, sizeof(int)); + break; case VKI_SIOCGLIFNUM: { struct vki_lifnum *p = (struct vki_lifnum *) ARG3; diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h index 7b5a6a05f..2f5556951 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -203,6 +203,8 @@ typedef struct { #include <net/if.h> +#define vki_ifconf ifconf +#define vki_ifreq ifreq #define vki_lifnum lifnum @@ -1062,6 +1064,10 @@ typedef struct sigaction vki_sigaction_fromK_t; #include <sys/sockio.h> +#define VKI_SIOCGIFCONF SIOCGIFCONF +#define VKI_SIOCGIFFLAGS SIOCGIFFLAGS +#define VKI_SIOCGIFNETMASK SIOCGIFNETMASK +#define VKI_SIOCGIFNUM SIOCGIFNUM #define VKI_SIOCGLIFNUM SIOCGLIFNUM diff --git a/memcheck/tests/solaris/scalar_ioctl.c b/memcheck/tests/solaris/scalar_ioctl.c index c11b32669..9804a993b 100644 --- a/memcheck/tests/solaris/scalar_ioctl.c +++ b/memcheck/tests/solaris/scalar_ioctl.c @@ -4,6 +4,7 @@ #include "scalar.h" +#include <unistd.h> #include <net/if.h> #include <sys/crypto/ioctl.h> #include <sys/dtrace.h> @@ -212,6 +213,120 @@ static void sys_ioctl_I_CANPUT(void) /* sockio */ __attribute__((noinline)) +static void sys_ioctl_SIOCGIFCONF(void) +{ + GO(SYS_ioctl, "(SIOCGIFCONF), 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFCONF, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFCONF_2(void) +{ + struct ifconf ifc; + char buf[5]; + + ifc.ifc_len = x0 + 5; + ifc.ifc_buf = (void *) (x0 + buf); + + GO(SYS_ioctl, "(SIOCGIFCONF), 5s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFCONF, &ifc + x0); FAIL; +} + +__attribute__((noinline)) +static int sys_ioctl_SIOCGIFCONF_3(void) +{ +#define BUF_SIZE sizeof(struct ifreq) * 1000 + + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + perror("socket"); + + int n_ifs; + if (ioctl(fd, SIOCGIFNUM, &n_ifs) < 0) + perror("ioctl(SIOCGIFNUM)"); + + struct ifconf ifc; + ifc.ifc_len = (n_ifs + 1) * sizeof(struct ifreq); + ifc.ifc_buf = malloc((n_ifs + 1) * sizeof(struct ifreq)); + if (ifc.ifc_buf == NULL) + perror("malloc"); + + GO(SYS_ioctl, "(SIOCGIFCONF), 1s 0m"); + if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) + perror("ioctl(SIOCGIFCONF)"); + + /* Check definedness of ifc attributes ... */ + int x = 0; + if (ifc.ifc_len != 0) x = -1; else x = -2; + if (ifc.ifc_req != NULL) x = -3; else x = -4; + if (strcmp(ifc.ifc_req[0].ifr_name, "") != 0) x = -5; else x = -6; + /* ... and now one which is not defined. */ + if (strcmp(ifc.ifc_req[n_ifs].ifr_name, "") != 0) x = -7; else x = -8; + + free(ifc.ifc_buf); + close(fd); + return x; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFFLAGS(void) +{ + GO(SYS_ioctl, "(SIOCGIFFLAGS) 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFFLAGS, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFFLAGS_2(void) +{ + struct ifreq ifr; + + ifr.ifr_name[0] = x0 + 'l'; + ifr.ifr_name[1] = x0 + 'o'; + ifr.ifr_name[2] = x0 + '0'; + ifr.ifr_name[3] = x0 + '\0'; + + GO(SYS_ioctl, "(SIOCGIFFLAGS), 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFFLAGS, &ifr + x0); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFNETMASK(void) +{ + GO(SYS_ioctl, "(SIOCGIFNETMASK) 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNETMASK, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFNETMASK_2(void) +{ + struct ifreq ifr; + + ifr.ifr_name[0] = x0 + 'l'; + ifr.ifr_name[1] = x0 + 'o'; + ifr.ifr_name[2] = x0 + '0'; + ifr.ifr_name[3] = x0 + '\0'; + + GO(SYS_ioctl, "(SIOCGIFNETMASK), 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNETMASK, &ifr + x0); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFNUM(void) +{ + int ifnum; + + GO(SYS_ioctl, "(SIOCGIFNUM) 3s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNUM, &ifnum + x0); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGIFNUM_2(void) +{ + GO(SYS_ioctl, "(SIOCGIFNUM) 3s 1m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNUM, x0 - 1); FAIL; +} + +__attribute__((noinline)) static void sys_ioctl_SIOCGLIFNUM(void) { struct lifnum lifn; @@ -318,6 +433,15 @@ int main(void) sys_ioctl_I_CANPUT(); /* sockio */ + sys_ioctl_SIOCGIFCONF(); + sys_ioctl_SIOCGIFCONF_2(); + sys_ioctl_SIOCGIFCONF_3(); + sys_ioctl_SIOCGIFFLAGS(); + sys_ioctl_SIOCGIFFLAGS_2(); + sys_ioctl_SIOCGIFNETMASK(); + sys_ioctl_SIOCGIFNETMASK_2(); + sys_ioctl_SIOCGIFNUM(); + sys_ioctl_SIOCGIFNUM_2(); sys_ioctl_SIOCGLIFNUM(); /* filio */ diff --git a/memcheck/tests/solaris/scalar_ioctl.stderr.exp b/memcheck/tests/solaris/scalar_ioctl.stderr.exp index d9bdceb75..471b98e6f 100644 --- a/memcheck/tests/solaris/scalar_ioctl.stderr.exp +++ b/memcheck/tests/solaris/scalar_ioctl.stderr.exp @@ -424,6 +424,152 @@ Syscall param ioctl(arg) contains uninitialised byte(s) ... --------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFCONF), 3s 2m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFCONF, ifconf->ifc_len) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGIFCONF, ifconf->ifc_buf) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFCONF), 5s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFCONF, ifconf->ifc_len) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +Syscall param ioctl(SIOCGIFCONF, ifconf->ifc_buf) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFCONF), 1s 0m +--------------------------------------------------------- +Conditional jump or move depends on uninitialised value(s) + ... + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFFLAGS) 3s 2m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_name) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_flags) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFFLAGS), 4s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_name) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFNETMASK) 3s 2m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_name) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_addr) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFNETMASK), 4s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFFLAGS, ifreq->ifr_name) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFNUM) 3s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGIFNUM) 3s 1m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(SIOCGIFNUM) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- 54: SYS_ioctl (SIOCGLIFNUM) 4s 0m --------------------------------------------------------- Syscall param ioctl(fd) contains uninitialised byte(s) |