regbuf-merge.c 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. // autogenerated by syzkaller (https://github.com/google/syzkaller)
  4. #include <endian.h>
  5. #include <stdint.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <sys/mman.h>
  10. #include <sys/syscall.h>
  11. #include <sys/types.h>
  12. #include <unistd.h>
  13. #include "helpers.h"
  14. #ifndef __NR_io_uring_register
  15. #define __NR_io_uring_register 427
  16. #endif
  17. #ifndef __NR_io_uring_setup
  18. #define __NR_io_uring_setup 425
  19. #endif
  20. #define SIZEOF_IO_URING_SQE 64
  21. #define SIZEOF_IO_URING_CQE 16
  22. #define SQ_HEAD_OFFSET 0
  23. #define SQ_TAIL_OFFSET 64
  24. #define SQ_RING_MASK_OFFSET 256
  25. #define SQ_RING_ENTRIES_OFFSET 264
  26. #define SQ_FLAGS_OFFSET 276
  27. #define SQ_DROPPED_OFFSET 272
  28. #define CQ_HEAD_OFFSET 128
  29. #define CQ_TAIL_OFFSET 192
  30. #define CQ_RING_MASK_OFFSET 260
  31. #define CQ_RING_ENTRIES_OFFSET 268
  32. #define CQ_RING_OVERFLOW_OFFSET 284
  33. #define CQ_FLAGS_OFFSET 280
  34. #define CQ_CQES_OFFSET 320
  35. static long syz_io_uring_setup(volatile long a0, volatile long a1, volatile long a2, volatile long a3, volatile long a4, volatile long a5)
  36. {
  37. uint32_t entries = (uint32_t)a0;
  38. struct io_uring_params* setup_params = (struct io_uring_params*)a1;
  39. void* vma1 = (void*)a2;
  40. void* vma2 = (void*)a3;
  41. void** ring_ptr_out = (void**)a4;
  42. void** sqes_ptr_out = (void**)a5;
  43. uint32_t fd_io_uring = syscall(__NR_io_uring_setup, entries, setup_params);
  44. uint32_t sq_ring_sz = setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
  45. uint32_t cq_ring_sz = setup_params->cq_off.cqes + setup_params->cq_entries * SIZEOF_IO_URING_CQE;
  46. uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
  47. *ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQ_RING);
  48. uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
  49. *sqes_ptr_out = mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
  50. return fd_io_uring;
  51. }
  52. static uint64_t r[1] = {0xffffffffffffffff};
  53. int main(int argc, char *argv[])
  54. {
  55. intptr_t res = 0;
  56. if (argc > 1)
  57. return T_EXIT_SKIP;
  58. mmap((void *) 0x1ffff000ul, 0x1000ul, PROT_NONE,
  59. MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
  60. mmap((void *) 0x20000000ul, 0x1000000ul, PROT_READ|PROT_WRITE|PROT_EXEC,
  61. MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
  62. mmap((void *) 0x21000000ul, 0x1000ul, PROT_NONE,
  63. MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
  64. *(uint32_t*)0x20000684 = 0;
  65. *(uint32_t*)0x20000688 = 0;
  66. *(uint32_t*)0x2000068c = 0;
  67. *(uint32_t*)0x20000690 = 0;
  68. *(uint32_t*)0x20000698 = -1;
  69. memset((void*)0x2000069c, 0, 12);
  70. res = syz_io_uring_setup(0x2fd6, 0x20000680, 0x20ffd000, 0x20ffc000,
  71. 0x20000700, 0x20000740);
  72. if (res != -1)
  73. r[0] = res;
  74. *(uint64_t*)0x20002840 = 0;
  75. *(uint64_t*)0x20002848 = 0;
  76. *(uint64_t*)0x20002850 = 0x20000840;
  77. *(uint64_t*)0x20002858 = 0x1000;
  78. syscall(__NR_io_uring_register, r[0], 0ul, 0x20002840ul, 2ul);
  79. return T_EXIT_PASS;
  80. }