DF-2433 / miscctl.c
#include <sys/types.h> #include <sys/sysctl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> int main(int argc, char **argv) { char cmd[160]; if (argc < 2) return 1; if (!strcmp(argv[1], "ccd")) { static char p0[] = "/dev/vn0s0a", p1[] = "/dev/vn1s0a"; static char *arr[2]; int n = atoi(argv[2]), ctl = argc > 3 && !strcmp(argv[3], "ctl"); arr[0] = p0; arr[1] = p1; snprintf(cmd, sizeof cmd, "paths %lx %lx", (unsigned long)(uintptr_t)arr, (unsigned long)(uintptr_t)p1); if (sysctlbyname("kern.dfmiscgo", NULL, NULL, cmd, strlen(cmd)) < 0) { perror("paths"); return 1; } snprintf(cmd, sizeof cmd, "%s %d", ctl ? "ccdctl" : "ccdleak", n); } else if (!strcmp(argv[1], "isopt")) { static char d[] = "CRC32C"; static char buf[1024]; /* big enough for kernel isc_opt_t */ memset(buf, 0, sizeof(buf)); *(char **)(buf + 0x40) = d; /* offsetof(isc_opt_t, headerDigest) */ snprintf(cmd, sizeof cmd, "isopt %lx", (unsigned long)(uintptr_t)buf); } else if (!strcmp(argv[1], "race")) { static char a0[]="/dev/vn2s0a", a1[]="/dev/vn3s0a"; static char b0[]="/dev/vn0s0a", b1[]="/dev/vn1s0a"; static char *arra[2], *arrb[2]; int n = atoi(argv[2]); arra[0]=a0; arra[1]=a1; arrb[0]=b0; arrb[1]=b1; snprintf(cmd, sizeof cmd, "race %lx %lx %lx %lx %d", (unsigned long)(uintptr_t)arra, (unsigned long)(uintptr_t)arra, (unsigned long)(uintptr_t)arrb, (unsigned long)(uintptr_t)arrb, n); } else { snprintf(cmd, sizeof cmd, "%s", argv[1]); for (int i = 2; i < argc; i++) { strlcat(cmd, " ", sizeof cmd); strlcat(cmd, argv[i], sizeof cmd); } } if (sysctlbyname("kern.dfmiscgo", NULL, NULL, cmd, strlen(cmd)) < 0) { perror(cmd); return 1; } return 0; } |