SIOCGIFCONF, SIOCGIFFLAGS, SIOCGIFNETMASK, and SIOCGIFNUM.
n-i-bz
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15686
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;
PRE_FIELD_WRITE("ioctl(SIOCGLIFNUM, lifn->lifn_count)",
p->lifn_count);
}
- break;
+ break;
/* filio */
case VKI_FIOSETOWN:
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;
#include <net/if.h>
+#define vki_ifconf ifconf
+#define vki_ifreq ifreq
#define vki_lifnum lifnum
#include <sys/sockio.h>
+#define VKI_SIOCGIFCONF SIOCGIFCONF
+#define VKI_SIOCGIFFLAGS SIOCGIFFLAGS
+#define VKI_SIOCGIFNETMASK SIOCGIFNETMASK
+#define VKI_SIOCGIFNUM SIOCGIFNUM
#define VKI_SIOCGLIFNUM SIOCGLIFNUM
#include "scalar.h"
+#include <unistd.h>
#include <net/if.h>
#include <sys/crypto/ioctl.h>
#include <sys/dtrace.h>
}
/* 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)
{
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 */
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
---------------------------------------------------------