diff options
Diffstat (limited to 'pkg/csource')
| -rw-r--r-- | pkg/csource/generated.go | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 867cfa183..334cbe167 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -5377,6 +5377,7 @@ static long syz_init_net_socket(volatile long domain, volatile long type, volati #if SYZ_EXECUTOR || SYZ_VHCI_INJECTION #include <errno.h> #include <fcntl.h> +#include <linux/rfkill.h> #include <pthread.h> #include <sys/epoll.h> #include <sys/ioctl.h> @@ -5485,6 +5486,22 @@ struct vhci_vendor_pkt { static int vhci_fd = -1; +void rfkill_unblock_all() +{ + int fd = open("/dev/rfkill", O_WRONLY); + if (fd < 0) + fail("open /dev/rfkill failed"); + struct rfkill_event event = {0}; + event.idx = 0; + event.type = RFKILL_TYPE_ALL; + event.op = RFKILL_OP_CHANGE_ALL; + event.soft = 0; + event.hard = 0; + if (write(fd, &event, sizeof(event)) < 0) + fail("write rfkill event failed\n"); + close(fd); +} + static void hci_send_event_packet(int fd, uint8 evt, void* data, size_t data_len) { struct iovec iv[3]; @@ -5621,8 +5638,16 @@ static void initialize_vhci() pthread_t th; if (pthread_create(&th, NULL, event_thread, NULL)) fail("pthread_create failed"); - if (ioctl(hci_sock, HCIDEVUP, vendor_pkt.id) && errno != EALREADY) - fail("ioctl(HCIDEVUP) failed"); + int ret = ioctl(hci_sock, HCIDEVUP, vendor_pkt.id); + if (ret) { + if (errno == ERFKILL) { + rfkill_unblock_all(); + ret = ioctl(hci_sock, HCIDEVUP, vendor_pkt.id); + } + + if (ret && errno != EALREADY) + fail("ioctl(HCIDEVUP) failed"); + } struct hci_dev_req dr = {0}; dr.dev_id = vendor_pkt.id; dr.dev_opt = SCAN_PAGE; |
