From: Ivo Raisr Date: Tue, 29 Sep 2015 14:23:51 +0000 (+0000) Subject: Solaris ioctl: more of those sockio ioctl wrappers. X-Git-Tag: svn/VALGRIND_3_12_0~334 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf2ca3123fd61fed7660ffa5fa3735af194bbdf9;p=thirdparty%2Fvalgrind.git Solaris ioctl: more of those sockio ioctl wrappers. SIOCGLIFBRDADDR, SIOCGLIFCONF, SIOCGLIFFLAGS, SIOCGLIFNETMASK. n-i-bz git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15689 --- diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 36a03caa66..d2f831e270 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -3184,6 +3184,50 @@ PRE(sys_ioctl) case VKI_SIOCGIFNUM: PRE_MEM_WRITE("ioctl(SIOCGIFNUM)", ARG3, sizeof(int)); break; + case VKI_SIOCGLIFBRDADDR: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGLIFBRDADDR, lifreq->lifr_name)", + p->lifr_name); + PRE_FIELD_WRITE("ioctl(SIOCGLIFBRDADDR, lifreq->lifr_addr)", + p->lifr_addr); + } + break; + case VKI_SIOCGLIFCONF: + { + struct vki_lifconf *p = (struct vki_lifconf *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGLIFCONF, lifconf->lifc_len)", p->lifc_len); + PRE_FIELD_READ("ioctl(SIOCGLIFCONF, lifconf->lifc_buf)", p->lifc_buf); + PRE_FIELD_READ("ioctl(SIOCGLIFCONF, lifconf->lifc_family)", + p->lifc_family); + PRE_FIELD_READ("ioctl(SIOCGLIFCONF, lifconf->lifc_flags)", + p->lifc_flags); + if (ML_(safe_to_deref)(p, sizeof(*p))) { + if ((p->lifc_buf != NULL) && (p->lifc_len > 0)) + PRE_MEM_WRITE("ioctl(SIOCGLIFCONF, lifconf->lifc_buf)", + (Addr) p->lifc_buf, p->lifc_len); + } + /* lifc_len gets also written to during SIOCGLIFCONF ioctl. */ + } + break; + case VKI_SIOCGLIFFLAGS: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGLIFFLAGS, lifreq->lifr_name)", + p->lifr_name); + PRE_FIELD_WRITE("ioctl(SIOCGLIFFLAGS, lifreq->lifr_flags)", + p->lifr_flags); + } + break; + case VKI_SIOCGLIFNETMASK: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + PRE_FIELD_READ("ioctl(SIOCGLIFNETMASK, lifreq->lifr_name)", + p->lifr_name); + PRE_FIELD_WRITE("ioctl(SIOCGLIFNETMASK, lifreq->lifr_addr)", + p->lifr_addr); + } + break; case VKI_SIOCGLIFNUM: { struct vki_lifnum *p = (struct vki_lifnum *) ARG3; @@ -3375,6 +3419,33 @@ POST(sys_ioctl) case VKI_SIOCGIFNUM: POST_MEM_WRITE(ARG3, sizeof(int)); break; + case VKI_SIOCGLIFBRDADDR: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + POST_FIELD_WRITE(p->lifr_addr); + } + break; + case VKI_SIOCGLIFCONF: + { + struct vki_lifconf *p = (struct vki_lifconf *) ARG3; + POST_FIELD_WRITE(p->lifc_len); + POST_FIELD_WRITE(p->lifc_req); + if ((p->lifc_req != NULL) && (p->lifc_len > 0)) + POST_MEM_WRITE((Addr) p->lifc_req, p->lifc_len); + } + break; + case VKI_SIOCGLIFFLAGS: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + POST_FIELD_WRITE(p->lifr_flags); + } + break; + case VKI_SIOCGLIFNETMASK: + { + struct vki_lifreq *p = (struct vki_lifreq *) ARG3; + POST_FIELD_WRITE(p->lifr_addr); + } + 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 2f55569515..cfd0810cd6 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -205,7 +205,9 @@ typedef struct { #include #define vki_ifconf ifconf #define vki_ifreq ifreq +#define vki_lifconf lifconf #define vki_lifnum lifnum +#define vki_lifreq lifreq #include @@ -1068,6 +1070,10 @@ typedef struct sigaction vki_sigaction_fromK_t; #define VKI_SIOCGIFFLAGS SIOCGIFFLAGS #define VKI_SIOCGIFNETMASK SIOCGIFNETMASK #define VKI_SIOCGIFNUM SIOCGIFNUM +#define VKI_SIOCGLIFBRDADDR SIOCGLIFBRDADDR +#define VKI_SIOCGLIFCONF SIOCGLIFCONF +#define VKI_SIOCGLIFFLAGS SIOCGLIFFLAGS +#define VKI_SIOCGLIFNETMASK SIOCGLIFNETMASK #define VKI_SIOCGLIFNUM SIOCGLIFNUM diff --git a/memcheck/tests/solaris/scalar_ioctl.c b/memcheck/tests/solaris/scalar_ioctl.c index 9804a993b7..c4b4c79dc9 100644 --- a/memcheck/tests/solaris/scalar_ioctl.c +++ b/memcheck/tests/solaris/scalar_ioctl.c @@ -235,8 +235,6 @@ static void sys_ioctl_SIOCGIFCONF_2(void) __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"); @@ -326,6 +324,130 @@ static void sys_ioctl_SIOCGIFNUM_2(void) SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNUM, x0 - 1); FAIL; } +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFBRDADDR(void) +{ + GO(SYS_ioctl, "(SIOCGLIFBRDADDR) 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFBRDADDR, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFBRDADDR_2(void) +{ + struct lifreq lifr; + + lifr.lifr_name[0] = x0 + 'l'; + lifr.lifr_name[1] = x0 + 'o'; + lifr.lifr_name[2] = x0 + '0'; + lifr.lifr_name[3] = x0 + '\0'; + + GO(SYS_ioctl, "(SIOCGLIFBRDADDR), 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFBRDADDR, &lifr + x0); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFCONF(void) +{ + GO(SYS_ioctl, "(SIOCGLIFCONF), 3s 4m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFCONF, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFCONF_2(void) +{ + struct lifconf lifc; + char buf[5]; + + lifc.lifc_len = x0 + 5; + lifc.lifc_buf = (void *) (x0 + buf); + lifc.lifc_family = x0 + 1; + lifc.lifc_flags = x0 + 0; + + GO(SYS_ioctl, "(SIOCGLIFCONF), 7s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFCONF, &lifc + x0); FAIL; +} + +__attribute__((noinline)) +static int sys_ioctl_SIOCGLIFCONF_3(void) +{ + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + perror("socket"); + + struct lifnum lifn; + lifn.lifn_family = AF_INET; + lifn.lifn_flags = 0; + if (ioctl(fd, SIOCGLIFNUM, &lifn) < 0) + perror("ioctl(SIOCGLIFNUM)"); + + struct lifconf lifc; + lifc.lifc_family = AF_INET; + lifc.lifc_flags = 0; + lifc.lifc_len = (lifn.lifn_count + 1) * sizeof(struct lifreq); + lifc.lifc_buf = malloc((lifn.lifn_count + 1) * sizeof(struct lifreq)); + if (lifc.lifc_buf == NULL) + perror("malloc"); + + GO(SYS_ioctl, "(SIOCGLIFCONF), 1s 0m"); + if (ioctl(fd, SIOCGLIFCONF, &lifc) < 0) + perror("ioctl(SIOCGLIFCONF)"); + + /* Check definedness of lifc attributes ... */ + int x = 0; + if (lifc.lifc_len != 0) x = -1; else x = -2; + if (lifc.lifc_req != NULL) x = -3; else x = -4; + if (strcmp(lifc.lifc_req[0].lifr_name, "") != 0) x = -5; else x = -6; + /* ... and now one which is not defined. */ + if (strcmp(lifc.lifc_req[lifn.lifn_count].lifr_name, "") != 0) + x = -7; else x = -8; + + free(lifc.lifc_buf); + close(fd); + return x; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFFLAGS(void) +{ + GO(SYS_ioctl, "(SIOCGLIFFLAGS) 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFFLAGS, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFFLAGS_2(void) +{ + struct lifreq lifr; + + lifr.lifr_name[0] = x0 + 'l'; + lifr.lifr_name[1] = x0 + 'o'; + lifr.lifr_name[2] = x0 + '0'; + lifr.lifr_name[3] = x0 + '\0'; + + GO(SYS_ioctl, "(SIOCGLIFFLAGS), 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFFLAGS, &lifr + x0); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFNETMASK(void) +{ + GO(SYS_ioctl, "(SIOCGLIFNETMASK) 3s 2m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFNETMASK, x0 - 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_SIOCGLIFNETMASK_2(void) +{ + struct lifreq lifr; + + lifr.lifr_name[0] = x0 + 'l'; + lifr.lifr_name[1] = x0 + 'o'; + lifr.lifr_name[2] = x0 + '0'; + lifr.lifr_name[3] = x0 + '\0'; + + GO(SYS_ioctl, "(SIOCGLIFNETMASK), 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFNETMASK, &lifr + x0); FAIL; +} + __attribute__((noinline)) static void sys_ioctl_SIOCGLIFNUM(void) { @@ -442,6 +564,15 @@ int main(void) sys_ioctl_SIOCGIFNETMASK_2(); sys_ioctl_SIOCGIFNUM(); sys_ioctl_SIOCGIFNUM_2(); + sys_ioctl_SIOCGLIFBRDADDR(); + sys_ioctl_SIOCGLIFBRDADDR_2(); + sys_ioctl_SIOCGLIFCONF(); + sys_ioctl_SIOCGLIFCONF_2(); + sys_ioctl_SIOCGLIFCONF_3(); + sys_ioctl_SIOCGLIFFLAGS(); + sys_ioctl_SIOCGLIFFLAGS_2(); + sys_ioctl_SIOCGLIFNETMASK(); + sys_ioctl_SIOCGLIFNETMASK_2(); sys_ioctl_SIOCGLIFNUM(); /* filio */ diff --git a/memcheck/tests/solaris/scalar_ioctl.stderr.exp b/memcheck/tests/solaris/scalar_ioctl.stderr.exp index 471b98e6f3..5a53d6eb61 100644 --- a/memcheck/tests/solaris/scalar_ioctl.stderr.exp +++ b/memcheck/tests/solaris/scalar_ioctl.stderr.exp @@ -569,6 +569,176 @@ Syscall param ioctl(SIOCGIFNUM) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFBRDADDR) 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(SIOCGLIFBRDADDR, lifreq->lifr_name) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFBRDADDR, lifreq->lifr_addr) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFBRDADDR), 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(SIOCGLIFBRDADDR, lifreq->lifr_name) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFCONF), 3s 4m +--------------------------------------------------------- +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(SIOCGLIFCONF, lifconf->lifc_len) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_buf) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_family) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_flags) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFCONF), 7s 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(SIOCGLIFCONF, lifconf->lifc_len) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_buf) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_family) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +Syscall param ioctl(SIOCGLIFCONF, lifconf->lifc_flags) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFCONF), 1s 0m +--------------------------------------------------------- +Conditional jump or move depends on uninitialised value(s) + ... + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFFLAGS) 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(SIOCGLIFFLAGS, lifreq->lifr_name) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFFLAGS, lifreq->lifr_flags) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFFLAGS), 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(SIOCGLIFFLAGS, lifreq->lifr_name) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFNETMASK) 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(SIOCGLIFNETMASK, lifreq->lifr_name) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param ioctl(SIOCGLIFNETMASK, lifreq->lifr_addr) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (SIOCGLIFNETMASK), 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(SIOCGLIFNETMASK, lifreq->lifr_name) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + --------------------------------------------------------- 54: SYS_ioctl (SIOCGLIFNUM) 4s 0m ---------------------------------------------------------