]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris ioctl: more of those sockio ioctl wrappers.
authorIvo Raisr <ivosh@ivosh.net>
Tue, 29 Sep 2015 14:23:51 +0000 (14:23 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Tue, 29 Sep 2015 14:23:51 +0000 (14:23 +0000)
SIOCGLIFBRDADDR, SIOCGLIFCONF, SIOCGLIFFLAGS, SIOCGLIFNETMASK.
n-i-bz

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15689

coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-solaris.h
memcheck/tests/solaris/scalar_ioctl.c
memcheck/tests/solaris/scalar_ioctl.stderr.exp

index 36a03caa668fef478e6ac87e33797d4abed91a19..d2f831e270924d4c67b485cd3c6b541b847275df 100644 (file)
@@ -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;
index 2f555695151e011abea6df5a7a0b6043135a48ef..cfd0810cd61a547302807a52b763c940afffd3ba 100644 (file)
@@ -205,7 +205,9 @@ typedef struct {
 #include <net/if.h>
 #define vki_ifconf ifconf
 #define vki_ifreq ifreq
+#define vki_lifconf lifconf
 #define vki_lifnum lifnum
+#define vki_lifreq lifreq
 
 
 #include <netinet/in.h>
@@ -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
 
 
index 9804a993b7bb5bc32daa9a1f0dba757199664fda..c4b4c79dc9e5f0f142767db0c72f8be0bcbc76c7 100644 (file)
@@ -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 */
index 471b98e6f31d4881ccb6048eaf0b79fee5bb7eaf..5a53d6eb61f6035d3384e00a810d7fe4b4901340 100644 (file)
@@ -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
 ---------------------------------------------------------