// https://syzkaller.appspot.com/bug?id=bee32f7e81ba30eaf1cab7be0d487780b5550e3a #define _GNU_SOURCE #include #include #include #include #include #include #include #include #ifndef __NR_io_uring_setup #if defined(__x86_64__) #define __NR_io_uring_setup 425 #elif defined(__aarch64__) #define __NR_io_uring_setup 425 #elif defined(__i386__) #define __NR_io_uring_setup 425 #endif #endif int main(void) { setvbuf(stdout, NULL, _IONBF, 0); printf("[*] Starting capability probe for io_uring and IORING_SETUP_SQPOLL...\n"); /* Probe 1: Basic io_uring support */ struct io_uring_params params_basic; memset(¶ms_basic, 0, sizeof(params_basic)); int ring_fd_basic = (int)syscall(__NR_io_uring_setup, 4, ¶ms_basic); if (ring_fd_basic < 0) { printf("[-] Failed io_uring_setup (basic): %s\n", strerror(errno)); exit(1); } printf("[+] io_uring_setup (basic) successful (fd=%d).\n", ring_fd_basic); int res = close(ring_fd_basic); if (res < 0) { printf("[-] Failed close(ring_fd_basic): %s\n", strerror(errno)); exit(1); } printf("[+] Closed basic ring fd successfully.\n"); /* Probe 2: IORING_SETUP_SQPOLL support and permissions */ struct io_uring_params params_sqpoll; memset(¶ms_sqpoll, 0, sizeof(params_sqpoll)); params_sqpoll.flags = IORING_SETUP_SQPOLL; params_sqpoll.sq_thread_idle = 2000; int ring_fd_sqpoll = (int)syscall(__NR_io_uring_setup, 4, ¶ms_sqpoll); if (ring_fd_sqpoll < 0) { printf("[-] Failed io_uring_setup (IORING_SETUP_SQPOLL): %s\n", strerror(errno)); exit(1); } printf("[+] io_uring_setup (IORING_SETUP_SQPOLL) successful (fd=%d).\n", ring_fd_sqpoll); res = close(ring_fd_sqpoll); if (res < 0) { printf("[-] Failed close(ring_fd_sqpoll): %s\n", strerror(errno)); exit(1); } printf("[+] Closed SQPOLL ring fd successfully.\n"); printf("[+] All capability probes passed successfully.\n"); return 0; }