aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9>2015-09-29 05:20:16 +0000
committeriraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9>2015-09-29 05:20:16 +0000
commit2d20d8d974914211ad308f00ced4743f369d730c (patch)
tree229061865d327f6ebb1ca0e4abe461104b6e696d
parent6150d3e63c6989aa7b6540ff75d6ae104ad3aa28 (diff)
downloadvalgrind-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.c56
-rw-r--r--include/vki/vki-solaris.h6
-rw-r--r--memcheck/tests/solaris/scalar_ioctl.c124
-rw-r--r--memcheck/tests/solaris/scalar_ioctl.stderr.exp146
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)