1 /* $OpenBSD: copy.c,v 1.3 2009/02/15 13:33:22 jsing Exp $ */
3 /* Written by Ted Unangst 2004 Public Domain */
7 #include <sys/sysctl.h>
9 #include <sys/socket.h>
10 #include <sys/ioctl.h>
11 #include <sys/syslimits.h>
25 fprintf(stderr, "%s\n", str);
30 main(int argc, char **argv)
33 char path[PATH_MAX + 1];
37 struct kinfo_proc2 kinfo;
38 size_t kinfosize = sizeof(kinfo);
43 s = socket(AF_INET, SOCK_DGRAM, 0);
49 mib[2] = KERN_PROC_PID;
51 mib[4] = sizeof(struct kinfo_proc2);
54 if (sysctl(mib, 6, &kinfo, &kinfosize, 0, 0))
57 for (i = 0; i < PATH_MAX; i++)
58 path[i] = (i % NAME_MAX) ? 'a' : '/';
59 path[PATH_MAX] = '\0';
62 badbuf = (void*)(long)kinfo.p_paddr;
64 /* printf("goodbuf %p badbuf %p\n", goodbuf, badbuf); */
67 if (!syscall(202, 0, 6, &kinfo, &kinfosize, 0, 0))
68 fail("copyin did not fail on 0 buf\n");
69 if (!syscall(202, badbuf, 6, &kinfo, &kinfosize, 0, 0))
70 fail("copyin did not fail on bad buf\n");
73 if (statfs("/", goodbuf))
74 fail("copyout failed on a good buf\n");
75 if (!statfs("/", 0) || errno != EFAULT)
76 fail("copyout didn't fail on 0 buf\n");
77 if (!statfs("/", badbuf) || errno != EFAULT)
78 fail("copyout didn't fail on bad buf\n");
81 memset(&ifrdesc, 0, sizeof(ifrdesc));
82 strlcpy(ifrdesc.ifr_name, "lo0", sizeof(ifrdesc.ifr_name));
83 ifrdesc.ifr_data = goodbuf;
84 if (ioctl(s, SIOCGIFDESCR, &ifrdesc))
85 fail("SIOCIFDESCR ioctl failed\n");
86 memset(&ifrdesc, 0, sizeof(ifrdesc));
87 strlcpy(ifrdesc.ifr_name, "lo0", sizeof(ifrdesc.ifr_name));
89 if (!ioctl(s, SIOCGIFDESCR, &ifrdesc))
90 fail("copyoutstr didn't fail on 0 buf\n");
91 memset(&ifrdesc, 0, sizeof(ifrdesc));
92 strlcpy(ifrdesc.ifr_name, "lo0", sizeof(ifrdesc.ifr_name));
93 ifrdesc.ifr_data = badbuf;
94 if (!ioctl(s, SIOCGIFDESCR, &ifrdesc))
95 fail("copyoutstr didn't fail on badbuf\n");
98 if (statfs("/", goodbuf))
99 fail("copyinstr failed on a good buf\n");
100 if (!statfs(0, goodbuf) || errno != EFAULT)
101 fail("copyinstr didn't fail on 0 buf\n");
102 if (!statfs(badbuf, goodbuf) || errno != EFAULT)
103 fail("copyinstr didn't fail on bad buf\n");
104 if (!statfs(path, goodbuf) || errno != ENAMETOOLONG)
105 fail("copyinstr didn't fail on long string\n");
108 errx(1, "%d failures", failure);