@nxtedition/rocksdb 5.2.36 → 5.2.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/binding.cc +66 -91
  2. package/deps/liburing/liburing/COPYING +502 -0
  3. package/deps/liburing/liburing/COPYING.GPL +339 -0
  4. package/deps/liburing/liburing/LICENSE +7 -0
  5. package/deps/liburing/liburing/Makefile +84 -0
  6. package/deps/liburing/liburing/Makefile.quiet +11 -0
  7. package/deps/liburing/liburing/README +46 -0
  8. package/deps/liburing/liburing/configure +420 -0
  9. package/deps/liburing/liburing/debian/README.Debian +7 -0
  10. package/deps/liburing/liburing/debian/changelog +27 -0
  11. package/deps/liburing/liburing/debian/compat +1 -0
  12. package/deps/liburing/liburing/debian/control +48 -0
  13. package/deps/liburing/liburing/debian/copyright +49 -0
  14. package/deps/liburing/liburing/debian/liburing-dev.install +4 -0
  15. package/deps/liburing/liburing/debian/liburing-dev.manpages +6 -0
  16. package/deps/liburing/liburing/debian/liburing1-udeb.install +1 -0
  17. package/deps/liburing/liburing/debian/liburing1.install +1 -0
  18. package/deps/liburing/liburing/debian/liburing1.symbols +32 -0
  19. package/deps/liburing/liburing/debian/patches/series +1 -0
  20. package/deps/liburing/liburing/debian/rules +81 -0
  21. package/deps/liburing/liburing/debian/source/format +1 -0
  22. package/deps/liburing/liburing/debian/source/local-options +2 -0
  23. package/deps/liburing/liburing/debian/source/options +1 -0
  24. package/deps/liburing/liburing/debian/watch +3 -0
  25. package/deps/liburing/liburing/examples/Makefile +29 -0
  26. package/deps/liburing/liburing/examples/io_uring-cp.c +279 -0
  27. package/deps/liburing/liburing/examples/io_uring-test.c +112 -0
  28. package/deps/liburing/liburing/examples/link-cp.c +193 -0
  29. package/deps/liburing/liburing/examples/ucontext-cp.c +273 -0
  30. package/deps/liburing/liburing/liburing.pc.in +12 -0
  31. package/deps/liburing/liburing/liburing.spec +66 -0
  32. package/deps/liburing/liburing/make-debs.sh +53 -0
  33. package/deps/liburing/liburing/man/io_uring.7 +736 -0
  34. package/deps/liburing/liburing/man/io_uring_enter.2 +1403 -0
  35. package/deps/liburing/liburing/man/io_uring_get_sqe.3 +37 -0
  36. package/deps/liburing/liburing/man/io_uring_queue_exit.3 +27 -0
  37. package/deps/liburing/liburing/man/io_uring_queue_init.3 +44 -0
  38. package/deps/liburing/liburing/man/io_uring_register.2 +605 -0
  39. package/deps/liburing/liburing/man/io_uring_setup.2 +515 -0
  40. package/deps/liburing/liburing/src/Makefile +76 -0
  41. package/deps/liburing/liburing/src/include/liburing/barrier.h +73 -0
  42. package/deps/liburing/liburing/src/include/liburing/io_uring.h +422 -0
  43. package/deps/liburing/liburing/src/include/liburing.h +775 -0
  44. package/deps/liburing/liburing/src/liburing.map +46 -0
  45. package/deps/liburing/liburing/src/queue.c +403 -0
  46. package/deps/liburing/liburing/src/register.c +299 -0
  47. package/deps/liburing/liburing/src/setup.c +356 -0
  48. package/deps/liburing/liburing/src/syscall.c +73 -0
  49. package/deps/liburing/liburing/src/syscall.h +20 -0
  50. package/deps/liburing/liburing/test/232c93d07b74-test.c +305 -0
  51. package/deps/liburing/liburing/test/35fa71a030ca-test.c +329 -0
  52. package/deps/liburing/liburing/test/500f9fbadef8-test.c +89 -0
  53. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +93 -0
  54. package/deps/liburing/liburing/test/8a9973408177-test.c +106 -0
  55. package/deps/liburing/liburing/test/917257daa0fe-test.c +53 -0
  56. package/deps/liburing/liburing/test/Makefile +312 -0
  57. package/deps/liburing/liburing/test/a0908ae19763-test.c +58 -0
  58. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +180 -0
  59. package/deps/liburing/liburing/test/accept-link.c +251 -0
  60. package/deps/liburing/liburing/test/accept-reuse.c +164 -0
  61. package/deps/liburing/liburing/test/accept-test.c +79 -0
  62. package/deps/liburing/liburing/test/accept.c +476 -0
  63. package/deps/liburing/liburing/test/across-fork.c +283 -0
  64. package/deps/liburing/liburing/test/b19062a56726-test.c +53 -0
  65. package/deps/liburing/liburing/test/b5837bd5311d-test.c +77 -0
  66. package/deps/liburing/liburing/test/ce593a6c480a-test.c +135 -0
  67. package/deps/liburing/liburing/test/close-opath.c +122 -0
  68. package/deps/liburing/liburing/test/config +10 -0
  69. package/deps/liburing/liburing/test/connect.c +398 -0
  70. package/deps/liburing/liburing/test/cq-full.c +96 -0
  71. package/deps/liburing/liburing/test/cq-overflow.c +294 -0
  72. package/deps/liburing/liburing/test/cq-peek-batch.c +102 -0
  73. package/deps/liburing/liburing/test/cq-ready.c +94 -0
  74. package/deps/liburing/liburing/test/cq-size.c +58 -0
  75. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +96 -0
  76. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +65 -0
  77. package/deps/liburing/liburing/test/defer.c +307 -0
  78. package/deps/liburing/liburing/test/double-poll-crash.c +186 -0
  79. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +114 -0
  80. package/deps/liburing/liburing/test/empty-eownerdead.c +42 -0
  81. package/deps/liburing/liburing/test/eventfd-disable.c +151 -0
  82. package/deps/liburing/liburing/test/eventfd-ring.c +97 -0
  83. package/deps/liburing/liburing/test/eventfd.c +112 -0
  84. package/deps/liburing/liburing/test/fadvise.c +202 -0
  85. package/deps/liburing/liburing/test/fallocate.c +249 -0
  86. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +138 -0
  87. package/deps/liburing/liburing/test/file-register.c +843 -0
  88. package/deps/liburing/liburing/test/file-update.c +173 -0
  89. package/deps/liburing/liburing/test/files-exit-hang-poll.c +128 -0
  90. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +134 -0
  91. package/deps/liburing/liburing/test/fixed-link.c +90 -0
  92. package/deps/liburing/liburing/test/fsync.c +224 -0
  93. package/deps/liburing/liburing/test/hardlink.c +136 -0
  94. package/deps/liburing/liburing/test/helpers.c +135 -0
  95. package/deps/liburing/liburing/test/helpers.h +67 -0
  96. package/deps/liburing/liburing/test/io-cancel.c +537 -0
  97. package/deps/liburing/liburing/test/io_uring_enter.c +296 -0
  98. package/deps/liburing/liburing/test/io_uring_register.c +664 -0
  99. package/deps/liburing/liburing/test/io_uring_setup.c +192 -0
  100. package/deps/liburing/liburing/test/iopoll.c +366 -0
  101. package/deps/liburing/liburing/test/lfs-openat-write.c +117 -0
  102. package/deps/liburing/liburing/test/lfs-openat.c +273 -0
  103. package/deps/liburing/liburing/test/link-timeout.c +1107 -0
  104. package/deps/liburing/liburing/test/link.c +496 -0
  105. package/deps/liburing/liburing/test/link_drain.c +229 -0
  106. package/deps/liburing/liburing/test/madvise.c +195 -0
  107. package/deps/liburing/liburing/test/mkdir.c +108 -0
  108. package/deps/liburing/liburing/test/multicqes_drain.c +383 -0
  109. package/deps/liburing/liburing/test/nop-all-sizes.c +107 -0
  110. package/deps/liburing/liburing/test/nop.c +115 -0
  111. package/deps/liburing/liburing/test/open-close.c +146 -0
  112. package/deps/liburing/liburing/test/openat2.c +240 -0
  113. package/deps/liburing/liburing/test/personality.c +204 -0
  114. package/deps/liburing/liburing/test/pipe-eof.c +81 -0
  115. package/deps/liburing/liburing/test/pipe-reuse.c +105 -0
  116. package/deps/liburing/liburing/test/poll-cancel-ton.c +139 -0
  117. package/deps/liburing/liburing/test/poll-cancel.c +135 -0
  118. package/deps/liburing/liburing/test/poll-link.c +227 -0
  119. package/deps/liburing/liburing/test/poll-many.c +208 -0
  120. package/deps/liburing/liburing/test/poll-mshot-update.c +273 -0
  121. package/deps/liburing/liburing/test/poll-ring.c +48 -0
  122. package/deps/liburing/liburing/test/poll-v-poll.c +353 -0
  123. package/deps/liburing/liburing/test/poll.c +109 -0
  124. package/deps/liburing/liburing/test/probe.c +137 -0
  125. package/deps/liburing/liburing/test/read-write.c +876 -0
  126. package/deps/liburing/liburing/test/register-restrictions.c +633 -0
  127. package/deps/liburing/liburing/test/rename.c +134 -0
  128. package/deps/liburing/liburing/test/ring-leak.c +173 -0
  129. package/deps/liburing/liburing/test/ring-leak2.c +249 -0
  130. package/deps/liburing/liburing/test/rsrc_tags.c +449 -0
  131. package/deps/liburing/liburing/test/runtests-loop.sh +16 -0
  132. package/deps/liburing/liburing/test/runtests.sh +170 -0
  133. package/deps/liburing/liburing/test/rw_merge_test.c +97 -0
  134. package/deps/liburing/liburing/test/self.c +91 -0
  135. package/deps/liburing/liburing/test/send_recv.c +291 -0
  136. package/deps/liburing/liburing/test/send_recvmsg.c +345 -0
  137. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +198 -0
  138. package/deps/liburing/liburing/test/shared-wq.c +84 -0
  139. package/deps/liburing/liburing/test/short-read.c +75 -0
  140. package/deps/liburing/liburing/test/shutdown.c +163 -0
  141. package/deps/liburing/liburing/test/sigfd-deadlock.c +74 -0
  142. package/deps/liburing/liburing/test/socket-rw-eagain.c +156 -0
  143. package/deps/liburing/liburing/test/socket-rw.c +147 -0
  144. package/deps/liburing/liburing/test/splice.c +511 -0
  145. package/deps/liburing/liburing/test/sq-full-cpp.cc +45 -0
  146. package/deps/liburing/liburing/test/sq-full.c +45 -0
  147. package/deps/liburing/liburing/test/sq-poll-dup.c +200 -0
  148. package/deps/liburing/liburing/test/sq-poll-kthread.c +168 -0
  149. package/deps/liburing/liburing/test/sq-poll-share.c +137 -0
  150. package/deps/liburing/liburing/test/sq-space_left.c +159 -0
  151. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +159 -0
  152. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +195 -0
  153. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +77 -0
  154. package/deps/liburing/liburing/test/sqpoll-sleep.c +68 -0
  155. package/deps/liburing/liburing/test/statx.c +172 -0
  156. package/deps/liburing/liburing/test/stdout.c +232 -0
  157. package/deps/liburing/liburing/test/submit-link-fail.c +154 -0
  158. package/deps/liburing/liburing/test/submit-reuse.c +239 -0
  159. package/deps/liburing/liburing/test/symlink.c +116 -0
  160. package/deps/liburing/liburing/test/teardowns.c +58 -0
  161. package/deps/liburing/liburing/test/thread-exit.c +131 -0
  162. package/deps/liburing/liburing/test/timeout-new.c +246 -0
  163. package/deps/liburing/liburing/test/timeout-overflow.c +204 -0
  164. package/deps/liburing/liburing/test/timeout.c +1354 -0
  165. package/deps/liburing/liburing/test/unlink.c +111 -0
  166. package/deps/liburing/liburing/test/wakeup-hang.c +162 -0
  167. package/deps/liburing/liburing.gyp +20 -0
  168. package/deps/rocksdb/rocksdb/db/corruption_test.cc +62 -0
  169. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -62
  170. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +25 -11
  171. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +74 -155
  172. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  173. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  174. package/deps/rocksdb/rocksdb/env/fs_posix.cc +13 -0
  175. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +4 -2
  176. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +22 -4
  177. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +5 -0
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +15 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -0
  182. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +3 -7
  183. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -29
  185. package/deps/rocksdb/rocksdb.gyp +4 -3
  186. package/package.json +1 -1
  187. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  188. package/prebuilds/darwin-x64/node.napi.node +0 -0
  189. package/prebuilds/linux-x64/node.napi.node +0 -0
  190. package/prebuilds/prebuilds/linux-x64/node.napi.node +0 -0
@@ -0,0 +1,307 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #include <errno.h>
3
+ #include <stdio.h>
4
+ #include <unistd.h>
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+ #include <fcntl.h>
8
+ #include <sys/uio.h>
9
+ #include <stdbool.h>
10
+
11
+ #include "helpers.h"
12
+ #include "liburing.h"
13
+
14
+ #define RING_SIZE 128
15
+
16
+ struct test_context {
17
+ struct io_uring *ring;
18
+ struct io_uring_sqe **sqes;
19
+ struct io_uring_cqe *cqes;
20
+ int nr;
21
+ };
22
+
23
+ static void free_context(struct test_context *ctx)
24
+ {
25
+ free(ctx->sqes);
26
+ free(ctx->cqes);
27
+ memset(ctx, 0, sizeof(*ctx));
28
+ }
29
+
30
+ static int init_context(struct test_context *ctx, struct io_uring *ring, int nr)
31
+ {
32
+ struct io_uring_sqe *sqe;
33
+ int i;
34
+
35
+ memset(ctx, 0, sizeof(*ctx));
36
+ ctx->nr = nr;
37
+ ctx->ring = ring;
38
+ ctx->sqes = t_malloc(nr * sizeof(*ctx->sqes));
39
+ ctx->cqes = t_malloc(nr * sizeof(*ctx->cqes));
40
+
41
+ if (!ctx->sqes || !ctx->cqes)
42
+ goto err;
43
+
44
+ for (i = 0; i < nr; i++) {
45
+ sqe = io_uring_get_sqe(ring);
46
+ if (!sqe)
47
+ goto err;
48
+ io_uring_prep_nop(sqe);
49
+ sqe->user_data = i;
50
+ ctx->sqes[i] = sqe;
51
+ }
52
+
53
+ return 0;
54
+ err:
55
+ free_context(ctx);
56
+ printf("init context failed\n");
57
+ return 1;
58
+ }
59
+
60
+ static int wait_cqes(struct test_context *ctx)
61
+ {
62
+ int ret, i;
63
+ struct io_uring_cqe *cqe;
64
+
65
+ for (i = 0; i < ctx->nr; i++) {
66
+ ret = io_uring_wait_cqe(ctx->ring, &cqe);
67
+
68
+ if (ret < 0) {
69
+ printf("wait_cqes: wait completion %d\n", ret);
70
+ return 1;
71
+ }
72
+ memcpy(&ctx->cqes[i], cqe, sizeof(*cqe));
73
+ io_uring_cqe_seen(ctx->ring, cqe);
74
+ }
75
+
76
+ return 0;
77
+ }
78
+
79
+ static int test_cancelled_userdata(struct io_uring *ring)
80
+ {
81
+ struct test_context ctx;
82
+ int ret, i, nr = 100;
83
+
84
+ if (init_context(&ctx, ring, nr))
85
+ return 1;
86
+
87
+ for (i = 0; i < nr; i++)
88
+ ctx.sqes[i]->flags |= IOSQE_IO_LINK;
89
+
90
+ ret = io_uring_submit(ring);
91
+ if (ret <= 0) {
92
+ printf("sqe submit failed: %d\n", ret);
93
+ goto err;
94
+ }
95
+
96
+ if (wait_cqes(&ctx))
97
+ goto err;
98
+
99
+ for (i = 0; i < nr; i++) {
100
+ if (i != ctx.cqes[i].user_data) {
101
+ printf("invalid user data\n");
102
+ goto err;
103
+ }
104
+ }
105
+
106
+ free_context(&ctx);
107
+ return 0;
108
+ err:
109
+ free_context(&ctx);
110
+ return 1;
111
+ }
112
+
113
+ static int test_thread_link_cancel(struct io_uring *ring)
114
+ {
115
+ struct test_context ctx;
116
+ int ret, i, nr = 100;
117
+
118
+ if (init_context(&ctx, ring, nr))
119
+ return 1;
120
+
121
+ for (i = 0; i < nr; i++)
122
+ ctx.sqes[i]->flags |= IOSQE_IO_LINK;
123
+
124
+ ret = io_uring_submit(ring);
125
+ if (ret <= 0) {
126
+ printf("sqe submit failed: %d\n", ret);
127
+ goto err;
128
+ }
129
+
130
+ if (wait_cqes(&ctx))
131
+ goto err;
132
+
133
+ for (i = 0; i < nr; i++) {
134
+ bool fail = false;
135
+
136
+ if (i == 0)
137
+ fail = (ctx.cqes[i].res != -EINVAL);
138
+ else
139
+ fail = (ctx.cqes[i].res != -ECANCELED);
140
+
141
+ if (fail) {
142
+ printf("invalid status\n");
143
+ goto err;
144
+ }
145
+ }
146
+
147
+ free_context(&ctx);
148
+ return 0;
149
+ err:
150
+ free_context(&ctx);
151
+ return 1;
152
+ }
153
+
154
+ static int test_drain_with_linked_timeout(struct io_uring *ring)
155
+ {
156
+ const int nr = 3;
157
+ struct __kernel_timespec ts = { .tv_sec = 1, .tv_nsec = 0, };
158
+ struct test_context ctx;
159
+ int ret, i;
160
+
161
+ if (init_context(&ctx, ring, nr * 2))
162
+ return 1;
163
+
164
+ for (i = 0; i < nr; i++) {
165
+ io_uring_prep_timeout(ctx.sqes[2 * i], &ts, 0, 0);
166
+ ctx.sqes[2 * i]->flags |= IOSQE_IO_LINK | IOSQE_IO_DRAIN;
167
+ io_uring_prep_link_timeout(ctx.sqes[2 * i + 1], &ts, 0);
168
+ }
169
+
170
+ ret = io_uring_submit(ring);
171
+ if (ret <= 0) {
172
+ printf("sqe submit failed: %d\n", ret);
173
+ goto err;
174
+ }
175
+
176
+ if (wait_cqes(&ctx))
177
+ goto err;
178
+
179
+ free_context(&ctx);
180
+ return 0;
181
+ err:
182
+ free_context(&ctx);
183
+ return 1;
184
+ }
185
+
186
+ static int run_drained(struct io_uring *ring, int nr)
187
+ {
188
+ struct test_context ctx;
189
+ int ret, i;
190
+
191
+ if (init_context(&ctx, ring, nr))
192
+ return 1;
193
+
194
+ for (i = 0; i < nr; i++)
195
+ ctx.sqes[i]->flags |= IOSQE_IO_DRAIN;
196
+
197
+ ret = io_uring_submit(ring);
198
+ if (ret <= 0) {
199
+ printf("sqe submit failed: %d\n", ret);
200
+ goto err;
201
+ }
202
+
203
+ if (wait_cqes(&ctx))
204
+ goto err;
205
+
206
+ free_context(&ctx);
207
+ return 0;
208
+ err:
209
+ free_context(&ctx);
210
+ return 1;
211
+ }
212
+
213
+ static int test_overflow_hung(struct io_uring *ring)
214
+ {
215
+ struct io_uring_sqe *sqe;
216
+ int ret, nr = 10;
217
+
218
+ while (*ring->cq.koverflow != 1000) {
219
+ sqe = io_uring_get_sqe(ring);
220
+ if (!sqe) {
221
+ printf("get sqe failed\n");
222
+ return 1;
223
+ }
224
+
225
+ io_uring_prep_nop(sqe);
226
+ ret = io_uring_submit(ring);
227
+ if (ret <= 0) {
228
+ printf("sqe submit failed: %d\n", ret);
229
+ return 1;
230
+ }
231
+ }
232
+
233
+ return run_drained(ring, nr);
234
+ }
235
+
236
+ static int test_dropped_hung(struct io_uring *ring)
237
+ {
238
+ int nr = 10;
239
+
240
+ *ring->sq.kdropped = 1000;
241
+ return run_drained(ring, nr);
242
+ }
243
+
244
+ int main(int argc, char *argv[])
245
+ {
246
+ struct io_uring ring, poll_ring, sqthread_ring;
247
+ struct io_uring_params p;
248
+ int ret;
249
+
250
+ if (argc > 1)
251
+ return 0;
252
+
253
+ memset(&p, 0, sizeof(p));
254
+ ret = io_uring_queue_init_params(RING_SIZE, &ring, &p);
255
+ if (ret) {
256
+ printf("ring setup failed %i\n", ret);
257
+ return 1;
258
+ }
259
+
260
+ ret = io_uring_queue_init(RING_SIZE, &poll_ring, IORING_SETUP_IOPOLL);
261
+ if (ret) {
262
+ printf("poll_ring setup failed\n");
263
+ return 1;
264
+ }
265
+
266
+
267
+ ret = test_cancelled_userdata(&poll_ring);
268
+ if (ret) {
269
+ printf("test_cancelled_userdata failed\n");
270
+ return ret;
271
+ }
272
+
273
+ if (!(p.features & IORING_FEAT_NODROP)) {
274
+ ret = test_overflow_hung(&ring);
275
+ if (ret) {
276
+ printf("test_overflow_hung failed\n");
277
+ return ret;
278
+ }
279
+ }
280
+
281
+ ret = test_dropped_hung(&ring);
282
+ if (ret) {
283
+ printf("test_dropped_hung failed\n");
284
+ return ret;
285
+ }
286
+
287
+ ret = test_drain_with_linked_timeout(&ring);
288
+ if (ret) {
289
+ printf("test_drain_with_linked_timeout failed\n");
290
+ return ret;
291
+ }
292
+
293
+ ret = t_create_ring(RING_SIZE, &sqthread_ring,
294
+ IORING_SETUP_SQPOLL | IORING_SETUP_IOPOLL);
295
+ if (ret == T_SETUP_SKIP)
296
+ return 0;
297
+ else if (ret < 0)
298
+ return 1;
299
+
300
+ ret = test_thread_link_cancel(&sqthread_ring);
301
+ if (ret) {
302
+ printf("test_thread_link_cancel failed\n");
303
+ return ret;
304
+ }
305
+
306
+ return 0;
307
+ }
@@ -0,0 +1,186 @@
1
+ // https://syzkaller.appspot.com/bug?id=5c9918d20f771265ad0ffae3c8f3859d24850692
2
+ // autogenerated by syzkaller (https://github.com/google/syzkaller)
3
+
4
+ #include <endian.h>
5
+ #include <fcntl.h>
6
+ #include <stdint.h>
7
+ #include <stdio.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+ #include <sys/mman.h>
11
+ #include <sys/stat.h>
12
+ #include <sys/types.h>
13
+ #include <sys/ioctl.h>
14
+ #include <unistd.h>
15
+
16
+ #include "liburing.h"
17
+ #include "../src/syscall.h"
18
+
19
+ #define SIZEOF_IO_URING_SQE 64
20
+ #define SIZEOF_IO_URING_CQE 16
21
+ #define SQ_HEAD_OFFSET 0
22
+ #define SQ_TAIL_OFFSET 64
23
+ #define SQ_RING_MASK_OFFSET 256
24
+ #define SQ_RING_ENTRIES_OFFSET 264
25
+ #define SQ_FLAGS_OFFSET 276
26
+ #define SQ_DROPPED_OFFSET 272
27
+ #define CQ_HEAD_OFFSET 128
28
+ #define CQ_TAIL_OFFSET 192
29
+ #define CQ_RING_MASK_OFFSET 260
30
+ #define CQ_RING_ENTRIES_OFFSET 268
31
+ #define CQ_RING_OVERFLOW_OFFSET 284
32
+ #define CQ_FLAGS_OFFSET 280
33
+ #define CQ_CQES_OFFSET 320
34
+
35
+ static long syz_io_uring_setup(volatile long a0, volatile long a1,
36
+ volatile long a2, volatile long a3,
37
+ volatile long a4, volatile long a5)
38
+ {
39
+ uint32_t entries = (uint32_t)a0;
40
+ struct io_uring_params* setup_params = (struct io_uring_params*)a1;
41
+ void* vma1 = (void*)a2;
42
+ void* vma2 = (void*)a3;
43
+ void** ring_ptr_out = (void**)a4;
44
+ void** sqes_ptr_out = (void**)a5;
45
+ uint32_t fd_io_uring = __sys_io_uring_setup(entries, setup_params);
46
+ uint32_t sq_ring_sz =
47
+ setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
48
+ uint32_t cq_ring_sz = setup_params->cq_off.cqes +
49
+ setup_params->cq_entries * SIZEOF_IO_URING_CQE;
50
+ uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
51
+ *ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE,
52
+ MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring,
53
+ IORING_OFF_SQ_RING);
54
+ uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
55
+ *sqes_ptr_out =
56
+ mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE,
57
+ MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
58
+ return fd_io_uring;
59
+ }
60
+
61
+ static long syz_io_uring_submit(volatile long a0, volatile long a1,
62
+ volatile long a2, volatile long a3)
63
+ {
64
+ char* ring_ptr = (char*)a0;
65
+ char* sqes_ptr = (char*)a1;
66
+ char* sqe = (char*)a2;
67
+ uint32_t sqes_index = (uint32_t)a3;
68
+ uint32_t sq_ring_entries = *(uint32_t*)(ring_ptr + SQ_RING_ENTRIES_OFFSET);
69
+ uint32_t cq_ring_entries = *(uint32_t*)(ring_ptr + CQ_RING_ENTRIES_OFFSET);
70
+ uint32_t sq_array_off =
71
+ (CQ_CQES_OFFSET + cq_ring_entries * SIZEOF_IO_URING_CQE + 63) & ~63;
72
+ if (sq_ring_entries)
73
+ sqes_index %= sq_ring_entries;
74
+ char* sqe_dest = sqes_ptr + sqes_index * SIZEOF_IO_URING_SQE;
75
+ memcpy(sqe_dest, sqe, SIZEOF_IO_URING_SQE);
76
+ uint32_t sq_ring_mask = *(uint32_t*)(ring_ptr + SQ_RING_MASK_OFFSET);
77
+ uint32_t* sq_tail_ptr = (uint32_t*)(ring_ptr + SQ_TAIL_OFFSET);
78
+ uint32_t sq_tail = *sq_tail_ptr & sq_ring_mask;
79
+ uint32_t sq_tail_next = *sq_tail_ptr + 1;
80
+ uint32_t* sq_array = (uint32_t*)(ring_ptr + sq_array_off);
81
+ *(sq_array + sq_tail) = sqes_index;
82
+ __atomic_store_n(sq_tail_ptr, sq_tail_next, __ATOMIC_RELEASE);
83
+ return 0;
84
+ }
85
+
86
+ static long syz_open_dev(volatile long a0, volatile long a1, volatile long a2)
87
+ {
88
+ if (a0 == 0xc || a0 == 0xb) {
89
+ char buf[128];
90
+ sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1,
91
+ (uint8_t)a2);
92
+ return open(buf, O_RDWR, 0);
93
+ } else {
94
+ char buf[1024];
95
+ char* hash;
96
+ strncpy(buf, (char*)a0, sizeof(buf) - 1);
97
+ buf[sizeof(buf) - 1] = 0;
98
+ while ((hash = strchr(buf, '#'))) {
99
+ *hash = '0' + (char)(a1 % 10);
100
+ a1 /= 10;
101
+ }
102
+ return open(buf, a2, 0);
103
+ }
104
+ }
105
+
106
+ #ifndef __NR_io_uring_enter
107
+ #define __NR_io_uring_enter 426
108
+ #endif
109
+
110
+ uint64_t r[4] = {0xffffffffffffffff, 0x0, 0x0, 0xffffffffffffffff};
111
+
112
+ int main(int argc, char *argv[])
113
+ {
114
+
115
+ if (argc > 1)
116
+ return 0;
117
+
118
+ mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul);
119
+ mmap((void *)0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul);
120
+ mmap((void *)0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul);
121
+ intptr_t res = 0;
122
+ *(uint32_t*)0x20000484 = 0;
123
+ *(uint32_t*)0x20000488 = 0;
124
+ *(uint32_t*)0x2000048c = 0;
125
+ *(uint32_t*)0x20000490 = 0;
126
+ *(uint32_t*)0x20000498 = -1;
127
+ *(uint32_t*)0x2000049c = 0;
128
+ *(uint32_t*)0x200004a0 = 0;
129
+ *(uint32_t*)0x200004a4 = 0;
130
+ res = -1;
131
+ res = syz_io_uring_setup(0x6ad4, 0x20000480, 0x20ee7000, 0x20ffb000,
132
+ 0x20000180, 0x20000040);
133
+ if (res != -1) {
134
+ r[0] = res;
135
+ r[1] = *(uint64_t*)0x20000180;
136
+ r[2] = *(uint64_t*)0x20000040;
137
+ }
138
+ res = -1;
139
+ res = syz_open_dev(0xc, 4, 0x15);
140
+ if (res != -1)
141
+ r[3] = res;
142
+ *(uint8_t*)0x20000000 = 6;
143
+ *(uint8_t*)0x20000001 = 0;
144
+ *(uint16_t*)0x20000002 = 0;
145
+ *(uint32_t*)0x20000004 = r[3];
146
+ *(uint64_t*)0x20000008 = 0;
147
+ *(uint64_t*)0x20000010 = 0;
148
+ *(uint32_t*)0x20000018 = 0;
149
+ *(uint16_t*)0x2000001c = 0;
150
+ *(uint16_t*)0x2000001e = 0;
151
+ *(uint64_t*)0x20000020 = 0;
152
+ *(uint16_t*)0x20000028 = 0;
153
+ *(uint16_t*)0x2000002a = 0;
154
+ *(uint8_t*)0x2000002c = 0;
155
+ *(uint8_t*)0x2000002d = 0;
156
+ *(uint8_t*)0x2000002e = 0;
157
+ *(uint8_t*)0x2000002f = 0;
158
+ *(uint8_t*)0x20000030 = 0;
159
+ *(uint8_t*)0x20000031 = 0;
160
+ *(uint8_t*)0x20000032 = 0;
161
+ *(uint8_t*)0x20000033 = 0;
162
+ *(uint8_t*)0x20000034 = 0;
163
+ *(uint8_t*)0x20000035 = 0;
164
+ *(uint8_t*)0x20000036 = 0;
165
+ *(uint8_t*)0x20000037 = 0;
166
+ *(uint8_t*)0x20000038 = 0;
167
+ *(uint8_t*)0x20000039 = 0;
168
+ *(uint8_t*)0x2000003a = 0;
169
+ *(uint8_t*)0x2000003b = 0;
170
+ *(uint8_t*)0x2000003c = 0;
171
+ *(uint8_t*)0x2000003d = 0;
172
+ *(uint8_t*)0x2000003e = 0;
173
+ *(uint8_t*)0x2000003f = 0;
174
+ syz_io_uring_submit(r[1], r[2], 0x20000000, 0);
175
+ __sys_io_uring_enter(r[0], 0x20450c, 0, 0ul, 0ul);
176
+ *(uint32_t*)0x20000080 = 0x7ff;
177
+ *(uint32_t*)0x20000084 = 0x8b7;
178
+ *(uint32_t*)0x20000088 = 3;
179
+ *(uint32_t*)0x2000008c = 0x101;
180
+ *(uint8_t*)0x20000090 = 9;
181
+ memcpy((void*)0x20000091, "\xaf\x09\x01\xbc\xf9\xc6\xe4\x92\x86\x51\x7d\x7f"
182
+ "\xbd\x43\x7d\x16\x69\x3e\x05",
183
+ 19);
184
+ ioctl(r[3], 0x5404, 0x20000080ul);
185
+ return 0;
186
+ }
@@ -0,0 +1,114 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: -EAGAIN handling
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "helpers.h"
14
+ #include "liburing.h"
15
+
16
+ #define BLOCK 4096
17
+
18
+ #ifndef RWF_NOWAIT
19
+ #define RWF_NOWAIT 8
20
+ #endif
21
+
22
+ static int get_file_fd(void)
23
+ {
24
+ ssize_t ret;
25
+ char *buf;
26
+ int fd;
27
+
28
+ fd = open("testfile", O_RDWR | O_CREAT, 0644);
29
+ unlink("testfile");
30
+ if (fd < 0) {
31
+ perror("open file");
32
+ return -1;
33
+ }
34
+
35
+ buf = t_malloc(BLOCK);
36
+ ret = write(fd, buf, BLOCK);
37
+ if (ret != BLOCK) {
38
+ if (ret < 0)
39
+ perror("write");
40
+ else
41
+ printf("Short write\n");
42
+ goto err;
43
+ }
44
+ fsync(fd);
45
+
46
+ if (posix_fadvise(fd, 0, 4096, POSIX_FADV_DONTNEED)) {
47
+ perror("fadvise");
48
+ err:
49
+ close(fd);
50
+ free(buf);
51
+ return -1;
52
+ }
53
+
54
+ free(buf);
55
+ return fd;
56
+ }
57
+
58
+ int main(int argc, char *argv[])
59
+ {
60
+ struct io_uring ring;
61
+ struct io_uring_sqe *sqe;
62
+ struct io_uring_cqe *cqe;
63
+ struct iovec iov;
64
+ int ret, fd;
65
+
66
+ if (argc > 1)
67
+ return 0;
68
+
69
+ iov.iov_base = t_malloc(4096);
70
+ iov.iov_len = 4096;
71
+
72
+ ret = io_uring_queue_init(2, &ring, 0);
73
+ if (ret) {
74
+ printf("ring setup failed\n");
75
+ return 1;
76
+
77
+ }
78
+
79
+ sqe = io_uring_get_sqe(&ring);
80
+ if (!sqe) {
81
+ printf("get sqe failed\n");
82
+ return 1;
83
+ }
84
+
85
+ fd = get_file_fd();
86
+ if (fd < 0)
87
+ return 1;
88
+
89
+ io_uring_prep_readv(sqe, fd, &iov, 1, 0);
90
+ sqe->rw_flags = RWF_NOWAIT;
91
+
92
+ ret = io_uring_submit(&ring);
93
+ if (ret != 1) {
94
+ printf("Got submit %d, expected 1\n", ret);
95
+ goto err;
96
+ }
97
+
98
+ ret = io_uring_peek_cqe(&ring, &cqe);
99
+ if (ret) {
100
+ printf("Ring peek got %d\n", ret);
101
+ goto err;
102
+ }
103
+
104
+ if (cqe->res != -EAGAIN && cqe->res != 4096) {
105
+ printf("cqe error: %d\n", cqe->res);
106
+ goto err;
107
+ }
108
+
109
+ close(fd);
110
+ return 0;
111
+ err:
112
+ close(fd);
113
+ return 1;
114
+ }
@@ -0,0 +1,42 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test if entering with nothing to submit/wait for SQPOLL returns an error.
4
+ */
5
+ #include <stdio.h>
6
+ #include <errno.h>
7
+ #include <string.h>
8
+
9
+ #include "liburing.h"
10
+ #include "helpers.h"
11
+ #include "../src/syscall.h"
12
+
13
+ int main(int argc, char *argv[])
14
+ {
15
+ struct io_uring_params p = {};
16
+ struct io_uring ring;
17
+ int ret;
18
+
19
+ if (argc > 1)
20
+ return 0;
21
+
22
+ p.flags = IORING_SETUP_SQPOLL;
23
+ p.sq_thread_idle = 100;
24
+
25
+ ret = t_create_ring_params(1, &ring, &p);
26
+ if (ret == T_SETUP_SKIP)
27
+ return 0;
28
+ else if (ret < 0)
29
+ goto err;
30
+
31
+ ret = __sys_io_uring_enter(ring.ring_fd, 0, 0, 0, NULL);
32
+ if (ret < 0) {
33
+ int __e = errno;
34
+
35
+ fprintf(stderr, "child: sqe submit failed: %s\n", strerror(__e));
36
+ goto err;
37
+ }
38
+
39
+ return 0;
40
+ err:
41
+ return 1;
42
+ }