]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris ioctl: more wrappers for sockio ioctls.
authorIvo Raisr <ivosh@ivosh.net>
Tue, 29 Sep 2015 05:20:16 +0000 (05:20 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Tue, 29 Sep 2015 05:20:16 +0000 (05:20 +0000)
SIOCGIFCONF, SIOCGIFFLAGS, SIOCGIFNETMASK, and SIOCGIFNUM.
n-i-bz

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

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 a5bc37b6993fe8d78d9ed7f06a2754f41f815be8..36a03caa668fef478e6ac87e33797d4abed91a19 100644 (file)
@@ -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;
index 7b5a6a05f624b0b8d5d95a86ecb45b982d0baa61..2f555695151e011abea6df5a7a0b6043135a48ef 100644 (file)
@@ -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
 
 
index c11b32669068e86251a845ce1ff5fe48388dac56..9804a993b7bb5bc32daa9a1f0dba757199664fda 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "scalar.h"
 
+#include <unistd.h>
 #include <net/if.h>
 #include <sys/crypto/ioctl.h>
 #include <sys/dtrace.h>
@@ -211,6 +212,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)
 {
@@ -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 */
index d9bdceb75cfd65d2d8c9e5fb8f959f705f545f8a..471b98e6f31d4881ccb6048eaf0b79fee5bb7eaf 100644 (file)
@@ -423,6 +423,152 @@ Syscall param ioctl(request) contains uninitialised byte(s)
 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
 ---------------------------------------------------------