@nxtedition/rocksdb 7.0.2 → 7.0.5

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 (135) hide show
  1. package/deps/liburing/liburing/README +46 -0
  2. package/deps/liburing/liburing/test/232c93d07b74-test.c +305 -0
  3. package/deps/liburing/liburing/test/35fa71a030ca-test.c +329 -0
  4. package/deps/liburing/liburing/test/500f9fbadef8-test.c +89 -0
  5. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +93 -0
  6. package/deps/liburing/liburing/test/8a9973408177-test.c +106 -0
  7. package/deps/liburing/liburing/test/917257daa0fe-test.c +53 -0
  8. package/deps/liburing/liburing/test/Makefile +312 -0
  9. package/deps/liburing/liburing/test/a0908ae19763-test.c +58 -0
  10. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +180 -0
  11. package/deps/liburing/liburing/test/accept-link.c +251 -0
  12. package/deps/liburing/liburing/test/accept-reuse.c +164 -0
  13. package/deps/liburing/liburing/test/accept-test.c +79 -0
  14. package/deps/liburing/liburing/test/accept.c +476 -0
  15. package/deps/liburing/liburing/test/across-fork.c +283 -0
  16. package/deps/liburing/liburing/test/b19062a56726-test.c +53 -0
  17. package/deps/liburing/liburing/test/b5837bd5311d-test.c +77 -0
  18. package/deps/liburing/liburing/test/ce593a6c480a-test.c +135 -0
  19. package/deps/liburing/liburing/test/close-opath.c +122 -0
  20. package/deps/liburing/liburing/test/config +10 -0
  21. package/deps/liburing/liburing/test/connect.c +398 -0
  22. package/deps/liburing/liburing/test/cq-full.c +96 -0
  23. package/deps/liburing/liburing/test/cq-overflow.c +294 -0
  24. package/deps/liburing/liburing/test/cq-peek-batch.c +102 -0
  25. package/deps/liburing/liburing/test/cq-ready.c +94 -0
  26. package/deps/liburing/liburing/test/cq-size.c +58 -0
  27. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +96 -0
  28. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +65 -0
  29. package/deps/liburing/liburing/test/defer.c +307 -0
  30. package/deps/liburing/liburing/test/double-poll-crash.c +186 -0
  31. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +114 -0
  32. package/deps/liburing/liburing/test/empty-eownerdead.c +42 -0
  33. package/deps/liburing/liburing/test/eventfd-disable.c +151 -0
  34. package/deps/liburing/liburing/test/eventfd-ring.c +97 -0
  35. package/deps/liburing/liburing/test/eventfd.c +112 -0
  36. package/deps/liburing/liburing/test/fadvise.c +202 -0
  37. package/deps/liburing/liburing/test/fallocate.c +249 -0
  38. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +138 -0
  39. package/deps/liburing/liburing/test/file-register.c +843 -0
  40. package/deps/liburing/liburing/test/file-update.c +173 -0
  41. package/deps/liburing/liburing/test/files-exit-hang-poll.c +128 -0
  42. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +134 -0
  43. package/deps/liburing/liburing/test/fixed-link.c +90 -0
  44. package/deps/liburing/liburing/test/fsync.c +224 -0
  45. package/deps/liburing/liburing/test/hardlink.c +136 -0
  46. package/deps/liburing/liburing/test/helpers.c +135 -0
  47. package/deps/liburing/liburing/test/helpers.h +67 -0
  48. package/deps/liburing/liburing/test/io-cancel.c +537 -0
  49. package/deps/liburing/liburing/test/io_uring_enter.c +296 -0
  50. package/deps/liburing/liburing/test/io_uring_register.c +664 -0
  51. package/deps/liburing/liburing/test/io_uring_setup.c +192 -0
  52. package/deps/liburing/liburing/test/iopoll.c +366 -0
  53. package/deps/liburing/liburing/test/lfs-openat-write.c +117 -0
  54. package/deps/liburing/liburing/test/lfs-openat.c +273 -0
  55. package/deps/liburing/liburing/test/link-timeout.c +1107 -0
  56. package/deps/liburing/liburing/test/link.c +496 -0
  57. package/deps/liburing/liburing/test/link_drain.c +229 -0
  58. package/deps/liburing/liburing/test/madvise.c +195 -0
  59. package/deps/liburing/liburing/test/mkdir.c +108 -0
  60. package/deps/liburing/liburing/test/multicqes_drain.c +383 -0
  61. package/deps/liburing/liburing/test/nop-all-sizes.c +107 -0
  62. package/deps/liburing/liburing/test/nop.c +115 -0
  63. package/deps/liburing/liburing/test/open-close.c +146 -0
  64. package/deps/liburing/liburing/test/openat2.c +240 -0
  65. package/deps/liburing/liburing/test/personality.c +204 -0
  66. package/deps/liburing/liburing/test/pipe-eof.c +81 -0
  67. package/deps/liburing/liburing/test/pipe-reuse.c +105 -0
  68. package/deps/liburing/liburing/test/poll-cancel-ton.c +139 -0
  69. package/deps/liburing/liburing/test/poll-cancel.c +135 -0
  70. package/deps/liburing/liburing/test/poll-link.c +227 -0
  71. package/deps/liburing/liburing/test/poll-many.c +208 -0
  72. package/deps/liburing/liburing/test/poll-mshot-update.c +273 -0
  73. package/deps/liburing/liburing/test/poll-ring.c +48 -0
  74. package/deps/liburing/liburing/test/poll-v-poll.c +353 -0
  75. package/deps/liburing/liburing/test/poll.c +109 -0
  76. package/deps/liburing/liburing/test/probe.c +137 -0
  77. package/deps/liburing/liburing/test/read-write.c +876 -0
  78. package/deps/liburing/liburing/test/register-restrictions.c +633 -0
  79. package/deps/liburing/liburing/test/rename.c +134 -0
  80. package/deps/liburing/liburing/test/ring-leak.c +173 -0
  81. package/deps/liburing/liburing/test/ring-leak2.c +249 -0
  82. package/deps/liburing/liburing/test/rsrc_tags.c +449 -0
  83. package/deps/liburing/liburing/test/runtests-loop.sh +16 -0
  84. package/deps/liburing/liburing/test/runtests.sh +170 -0
  85. package/deps/liburing/liburing/test/rw_merge_test.c +97 -0
  86. package/deps/liburing/liburing/test/self.c +91 -0
  87. package/deps/liburing/liburing/test/send_recv.c +291 -0
  88. package/deps/liburing/liburing/test/send_recvmsg.c +345 -0
  89. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +198 -0
  90. package/deps/liburing/liburing/test/shared-wq.c +84 -0
  91. package/deps/liburing/liburing/test/short-read.c +75 -0
  92. package/deps/liburing/liburing/test/shutdown.c +163 -0
  93. package/deps/liburing/liburing/test/sigfd-deadlock.c +74 -0
  94. package/deps/liburing/liburing/test/socket-rw-eagain.c +156 -0
  95. package/deps/liburing/liburing/test/socket-rw.c +147 -0
  96. package/deps/liburing/liburing/test/splice.c +511 -0
  97. package/deps/liburing/liburing/test/sq-full-cpp.cc +45 -0
  98. package/deps/liburing/liburing/test/sq-full.c +45 -0
  99. package/deps/liburing/liburing/test/sq-poll-dup.c +200 -0
  100. package/deps/liburing/liburing/test/sq-poll-kthread.c +168 -0
  101. package/deps/liburing/liburing/test/sq-poll-share.c +137 -0
  102. package/deps/liburing/liburing/test/sq-space_left.c +159 -0
  103. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +159 -0
  104. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +195 -0
  105. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +77 -0
  106. package/deps/liburing/liburing/test/sqpoll-sleep.c +68 -0
  107. package/deps/liburing/liburing/test/statx.c +172 -0
  108. package/deps/liburing/liburing/test/stdout.c +232 -0
  109. package/deps/liburing/liburing/test/submit-link-fail.c +154 -0
  110. package/deps/liburing/liburing/test/submit-reuse.c +239 -0
  111. package/deps/liburing/liburing/test/symlink.c +116 -0
  112. package/deps/liburing/liburing/test/teardowns.c +58 -0
  113. package/deps/liburing/liburing/test/thread-exit.c +131 -0
  114. package/deps/liburing/liburing/test/timeout-new.c +246 -0
  115. package/deps/liburing/liburing/test/timeout-overflow.c +204 -0
  116. package/deps/liburing/liburing/test/timeout.c +1354 -0
  117. package/deps/liburing/liburing/test/unlink.c +111 -0
  118. package/deps/liburing/liburing/test/wakeup-hang.c +162 -0
  119. package/deps/rocksdb/rocksdb/README.md +32 -0
  120. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  121. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  122. package/deps/rocksdb/rocksdb/port/README +10 -0
  123. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  124. package/package.json +1 -1
  125. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  126. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  127. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  128. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  129. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  130. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  131. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  132. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  133. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  134. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
  135. package/package-lock.json +0 -23687
@@ -0,0 +1,46 @@
1
+ liburing
2
+ --------
3
+
4
+ This is the io_uring library, liburing. liburing provides helpers to setup and
5
+ teardown io_uring instances, and also a simplified interface for
6
+ applications that don't need (or want) to deal with the full kernel
7
+ side implementation.
8
+
9
+ For more info on io_uring, please see:
10
+
11
+ https://kernel.dk/io_uring.pdf
12
+
13
+ Subscribe to io-uring@vger.kernel.org for io_uring related discussions
14
+ and development for both kernel and userspace. The list is archived here:
15
+
16
+ https://lore.kernel.org/io-uring/
17
+
18
+
19
+ ulimit settings
20
+ ---------------
21
+
22
+ io_uring accounts memory it needs under the rlimit memlocked option, which
23
+ can be quite low on some setups (64K). The default is usually enough for
24
+ most use cases, but bigger rings or things like registered buffers deplete
25
+ it quickly. root isn't under this restriction, but regular users are. Going
26
+ into detail on how to bump the limit on various systems is beyond the scope
27
+ of this little blurb, but check /etc/security/limits.conf for user specific
28
+ settings, or /etc/systemd/user.conf and /etc/systemd/system.conf for systemd
29
+ setups.
30
+
31
+ Regressions tests
32
+ -----------------
33
+
34
+ The bulk of liburing is actually regression/unit tests for both liburing and
35
+ the kernel io_uring support. Please note that this suite isn't expected to
36
+ pass on older kernels, and may even crash or hang older kernels!
37
+
38
+ License
39
+ -------
40
+
41
+ All software contained within this repo is dual licensed LGPL and MIT, see
42
+ COPYING and LICENSE, except for a header coming from the kernel which is
43
+ dual licensed GPL with a Linux-syscall-note exception and MIT, see
44
+ COPYING.GPL and <https://spdx.org/licenses/Linux-syscall-note.html>.
45
+
46
+ Jens Axboe 2020-01-20
@@ -0,0 +1,305 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test case for socket read/write through IORING_OP_READV and
4
+ * IORING_OP_WRITEV, using both TCP and sockets and blocking and
5
+ * non-blocking IO.
6
+ *
7
+ * Heavily based on a test case from Hrvoje Zeba <zeba.hrvoje@gmail.com>
8
+ */
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <stdint.h>
12
+ #include <assert.h>
13
+
14
+ #include <pthread.h>
15
+ #include <errno.h>
16
+ #include <fcntl.h>
17
+ #include <unistd.h>
18
+ #include <sys/socket.h>
19
+ #include <sys/un.h>
20
+ #include <netinet/tcp.h>
21
+ #include <netinet/in.h>
22
+
23
+ #include "liburing.h"
24
+
25
+ #define RECV_BUFF_SIZE 2
26
+ #define SEND_BUFF_SIZE 3
27
+
28
+ #define PORT 0x1235
29
+
30
+ struct params {
31
+ int tcp;
32
+ int non_blocking;
33
+ };
34
+
35
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
36
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
37
+ int rcv_ready = 0;
38
+
39
+ static void set_rcv_ready(void)
40
+ {
41
+ pthread_mutex_lock(&mutex);
42
+
43
+ rcv_ready = 1;
44
+ pthread_cond_signal(&cond);
45
+
46
+ pthread_mutex_unlock(&mutex);
47
+ }
48
+
49
+ static void wait_for_rcv_ready(void)
50
+ {
51
+ pthread_mutex_lock(&mutex);
52
+
53
+ while (!rcv_ready)
54
+ pthread_cond_wait(&cond, &mutex);
55
+
56
+ pthread_mutex_unlock(&mutex);
57
+ }
58
+
59
+ static void *rcv(void *arg)
60
+ {
61
+ struct params *p = arg;
62
+ int s0;
63
+ int res;
64
+
65
+ if (p->tcp) {
66
+ int val = 1;
67
+
68
+
69
+ s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
70
+ res = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
71
+ assert(res != -1);
72
+ res = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
73
+ assert(res != -1);
74
+
75
+ struct sockaddr_in addr;
76
+
77
+ addr.sin_family = AF_INET;
78
+ addr.sin_port = PORT;
79
+ addr.sin_addr.s_addr = 0x0100007fU;
80
+ res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
81
+ assert(res != -1);
82
+ } else {
83
+ s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
84
+ assert(s0 != -1);
85
+
86
+ struct sockaddr_un addr;
87
+ memset(&addr, 0, sizeof(addr));
88
+
89
+ addr.sun_family = AF_UNIX;
90
+ memcpy(addr.sun_path, "\0sock", 6);
91
+ res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
92
+ assert(res != -1);
93
+ }
94
+ res = listen(s0, 128);
95
+ assert(res != -1);
96
+
97
+ set_rcv_ready();
98
+
99
+ int s1 = accept(s0, NULL, NULL);
100
+ assert(s1 != -1);
101
+
102
+ if (p->non_blocking) {
103
+ int flags = fcntl(s1, F_GETFL, 0);
104
+ assert(flags != -1);
105
+
106
+ flags |= O_NONBLOCK;
107
+ res = fcntl(s1, F_SETFL, flags);
108
+ assert(res != -1);
109
+ }
110
+
111
+ struct io_uring m_io_uring;
112
+ void *ret = NULL;
113
+
114
+ res = io_uring_queue_init(32, &m_io_uring, 0);
115
+ assert(res >= 0);
116
+
117
+ int bytes_read = 0;
118
+ int expected_byte = 0;
119
+ int done = 0;
120
+
121
+ while (!done && bytes_read != 33) {
122
+ char buff[RECV_BUFF_SIZE];
123
+ struct iovec iov;
124
+
125
+ iov.iov_base = buff;
126
+ iov.iov_len = sizeof(buff);
127
+
128
+ struct io_uring_sqe *sqe = io_uring_get_sqe(&m_io_uring);
129
+ assert(sqe != NULL);
130
+
131
+ io_uring_prep_readv(sqe, s1, &iov, 1, 0);
132
+
133
+ res = io_uring_submit(&m_io_uring);
134
+ assert(res != -1);
135
+
136
+ struct io_uring_cqe *cqe;
137
+ unsigned head;
138
+ unsigned count = 0;
139
+
140
+ while (!done && count != 1) {
141
+ io_uring_for_each_cqe(&m_io_uring, head, cqe) {
142
+ if (cqe->res < 0)
143
+ assert(cqe->res == -EAGAIN);
144
+ else {
145
+ int i;
146
+
147
+ for (i = 0; i < cqe->res; i++) {
148
+ if (buff[i] != expected_byte) {
149
+ fprintf(stderr,
150
+ "Received %d, wanted %d\n",
151
+ buff[i], expected_byte);
152
+ ret++;
153
+ done = 1;
154
+ }
155
+ expected_byte++;
156
+ }
157
+ bytes_read += cqe->res;
158
+ }
159
+
160
+ count++;
161
+ }
162
+
163
+ assert(count <= 1);
164
+ io_uring_cq_advance(&m_io_uring, count);
165
+ }
166
+ }
167
+
168
+ shutdown(s1, SHUT_RDWR);
169
+ close(s1);
170
+ close(s0);
171
+ io_uring_queue_exit(&m_io_uring);
172
+ return ret;
173
+ }
174
+
175
+ static void *snd(void *arg)
176
+ {
177
+ struct params *p = arg;
178
+ int s0;
179
+ int ret;
180
+
181
+ wait_for_rcv_ready();
182
+
183
+ if (p->tcp) {
184
+ int val = 1;
185
+
186
+ s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
187
+ ret = setsockopt(s0, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
188
+ assert(ret != -1);
189
+
190
+ struct sockaddr_in addr;
191
+
192
+ addr.sin_family = AF_INET;
193
+ addr.sin_port = PORT;
194
+ addr.sin_addr.s_addr = 0x0100007fU;
195
+ ret = connect(s0, (struct sockaddr*) &addr, sizeof(addr));
196
+ assert(ret != -1);
197
+ } else {
198
+ s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
199
+ assert(s0 != -1);
200
+
201
+ struct sockaddr_un addr;
202
+ memset(&addr, 0, sizeof(addr));
203
+
204
+ addr.sun_family = AF_UNIX;
205
+ memcpy(addr.sun_path, "\0sock", 6);
206
+ ret = connect(s0, (struct sockaddr*) &addr, sizeof(addr));
207
+ assert(ret != -1);
208
+ }
209
+
210
+ if (p->non_blocking) {
211
+ int flags = fcntl(s0, F_GETFL, 0);
212
+ assert(flags != -1);
213
+
214
+ flags |= O_NONBLOCK;
215
+ ret = fcntl(s0, F_SETFL, flags);
216
+ assert(ret != -1);
217
+ }
218
+
219
+ struct io_uring m_io_uring;
220
+
221
+ ret = io_uring_queue_init(32, &m_io_uring, 0);
222
+ assert(ret >= 0);
223
+
224
+ int bytes_written = 0;
225
+ int done = 0;
226
+
227
+ while (!done && bytes_written != 33) {
228
+ char buff[SEND_BUFF_SIZE];
229
+ int i;
230
+
231
+ for (i = 0; i < SEND_BUFF_SIZE; i++)
232
+ buff[i] = i + bytes_written;
233
+
234
+ struct iovec iov;
235
+
236
+ iov.iov_base = buff;
237
+ iov.iov_len = sizeof(buff);
238
+
239
+ struct io_uring_sqe *sqe = io_uring_get_sqe(&m_io_uring);
240
+ assert(sqe != NULL);
241
+
242
+ io_uring_prep_writev(sqe, s0, &iov, 1, 0);
243
+
244
+ ret = io_uring_submit(&m_io_uring);
245
+ assert(ret != -1);
246
+
247
+ struct io_uring_cqe *cqe;
248
+ unsigned head;
249
+ unsigned count = 0;
250
+
251
+ while (!done && count != 1) {
252
+ io_uring_for_each_cqe(&m_io_uring, head, cqe) {
253
+ if (cqe->res < 0) {
254
+ if (cqe->res == -EPIPE) {
255
+ done = 1;
256
+ break;
257
+ }
258
+ assert(cqe->res == -EAGAIN);
259
+ } else {
260
+ bytes_written += cqe->res;
261
+ }
262
+
263
+ count++;
264
+ }
265
+
266
+ assert(count <= 1);
267
+ io_uring_cq_advance(&m_io_uring, count);
268
+ }
269
+ usleep(100000);
270
+ }
271
+
272
+ shutdown(s0, SHUT_RDWR);
273
+ close(s0);
274
+ io_uring_queue_exit(&m_io_uring);
275
+ return NULL;
276
+ }
277
+
278
+ int main(int argc, char *argv[])
279
+ {
280
+ struct params p;
281
+ pthread_t t1, t2;
282
+ void *res1, *res2;
283
+ int i, exit_val = 0;
284
+
285
+ if (argc > 1)
286
+ return 0;
287
+
288
+ for (i = 0; i < 4; i++) {
289
+ p.tcp = i & 1;
290
+ p.non_blocking = (i & 2) >> 1;
291
+
292
+ rcv_ready = 0;
293
+
294
+ pthread_create(&t1, NULL, rcv, &p);
295
+ pthread_create(&t2, NULL, snd, &p);
296
+ pthread_join(t1, &res1);
297
+ pthread_join(t2, &res2);
298
+ if (res1 || res2) {
299
+ fprintf(stderr, "Failed tcp=%d, non_blocking=%d\n", p.tcp, p.non_blocking);
300
+ exit_val = 1;
301
+ }
302
+ }
303
+
304
+ return exit_val;
305
+ }
@@ -0,0 +1,329 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ // autogenerated by syzkaller (https://github.com/google/syzkaller)
3
+
4
+ #include <dirent.h>
5
+ #include <endian.h>
6
+ #include <errno.h>
7
+ #include <fcntl.h>
8
+ #include <pthread.h>
9
+ #include <signal.h>
10
+ #include <stdarg.h>
11
+ #include <stdbool.h>
12
+ #include <stdint.h>
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+ #include <sys/prctl.h>
17
+ #include <sys/stat.h>
18
+ #include <sys/syscall.h>
19
+ #include <sys/types.h>
20
+ #include <sys/wait.h>
21
+ #include <time.h>
22
+ #include <unistd.h>
23
+ #include <sys/mman.h>
24
+
25
+ #include <linux/futex.h>
26
+
27
+ #include "liburing.h"
28
+ #include "../src/syscall.h"
29
+
30
+ #if !defined(SYS_futex) && defined(SYS_futex_time64)
31
+ # define SYS_futex SYS_futex_time64
32
+ #endif
33
+
34
+ static void sleep_ms(uint64_t ms)
35
+ {
36
+ usleep(ms * 1000);
37
+ }
38
+
39
+ static uint64_t current_time_ms(void)
40
+ {
41
+ struct timespec ts;
42
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
43
+ exit(1);
44
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
45
+ }
46
+
47
+ static void thread_start(void* (*fn)(void*), void* arg)
48
+ {
49
+ pthread_t th;
50
+ pthread_attr_t attr;
51
+ pthread_attr_init(&attr);
52
+ pthread_attr_setstacksize(&attr, 128 << 10);
53
+ int i;
54
+ for (i = 0; i < 100; i++) {
55
+ if (pthread_create(&th, &attr, fn, arg) == 0) {
56
+ pthread_attr_destroy(&attr);
57
+ return;
58
+ }
59
+ if (errno == EAGAIN) {
60
+ usleep(50);
61
+ continue;
62
+ }
63
+ break;
64
+ }
65
+ exit(1);
66
+ }
67
+
68
+ typedef struct {
69
+ int state;
70
+ } event_t;
71
+
72
+ static void event_init(event_t* ev)
73
+ {
74
+ ev->state = 0;
75
+ }
76
+
77
+ static void event_reset(event_t* ev)
78
+ {
79
+ ev->state = 0;
80
+ }
81
+
82
+ static void event_set(event_t* ev)
83
+ {
84
+ if (ev->state)
85
+ exit(1);
86
+ __atomic_store_n(&ev->state, 1, __ATOMIC_RELEASE);
87
+ syscall(SYS_futex, &ev->state, FUTEX_WAKE | FUTEX_PRIVATE_FLAG);
88
+ }
89
+
90
+ static void event_wait(event_t* ev)
91
+ {
92
+ while (!__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
93
+ syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, 0);
94
+ }
95
+
96
+ static int event_isset(event_t* ev)
97
+ {
98
+ return __atomic_load_n(&ev->state, __ATOMIC_ACQUIRE);
99
+ }
100
+
101
+ static int event_timedwait(event_t* ev, uint64_t timeout)
102
+ {
103
+ uint64_t start = current_time_ms();
104
+ uint64_t now = start;
105
+ for (;;) {
106
+ uint64_t remain = timeout - (now - start);
107
+ struct timespec ts;
108
+ ts.tv_sec = remain / 1000;
109
+ ts.tv_nsec = (remain % 1000) * 1000 * 1000;
110
+ syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, &ts);
111
+ if (__atomic_load_n(&ev->state, __ATOMIC_RELAXED))
112
+ return 1;
113
+ now = current_time_ms();
114
+ if (now - start > timeout)
115
+ return 0;
116
+ }
117
+ }
118
+
119
+ static bool write_file(const char* file, const char* what, ...)
120
+ {
121
+ char buf[1024];
122
+ va_list args;
123
+ va_start(args, what);
124
+ vsnprintf(buf, sizeof(buf), what, args);
125
+ va_end(args);
126
+ buf[sizeof(buf) - 1] = 0;
127
+ int len = strlen(buf);
128
+ int fd = open(file, O_WRONLY | O_CLOEXEC);
129
+ if (fd == -1)
130
+ return false;
131
+ if (write(fd, buf, len) != len) {
132
+ int err = errno;
133
+ close(fd);
134
+ errno = err;
135
+ return false;
136
+ }
137
+ close(fd);
138
+ return true;
139
+ }
140
+
141
+ static void kill_and_wait(int pid, int* status)
142
+ {
143
+ kill(-pid, SIGKILL);
144
+ kill(pid, SIGKILL);
145
+ int i;
146
+ for (i = 0; i < 100; i++) {
147
+ if (waitpid(-1, status, WNOHANG | __WALL) == pid)
148
+ return;
149
+ usleep(1000);
150
+ }
151
+ DIR* dir = opendir("/sys/fs/fuse/connections");
152
+ if (dir) {
153
+ for (;;) {
154
+ struct dirent* ent = readdir(dir);
155
+ if (!ent)
156
+ break;
157
+ if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
158
+ continue;
159
+ char abort[300];
160
+ snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
161
+ ent->d_name);
162
+ int fd = open(abort, O_WRONLY);
163
+ if (fd == -1) {
164
+ continue;
165
+ }
166
+ if (write(fd, abort, 1) < 0) {
167
+ }
168
+ close(fd);
169
+ }
170
+ closedir(dir);
171
+ } else {
172
+ }
173
+ while (waitpid(-1, status, __WALL) != pid) {
174
+ }
175
+ }
176
+
177
+ #define SYZ_HAVE_SETUP_TEST 1
178
+ static void setup_test()
179
+ {
180
+ prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
181
+ setpgrp();
182
+ write_file("/proc/self/oom_score_adj", "1000");
183
+ }
184
+
185
+ struct thread_t {
186
+ int created, call;
187
+ event_t ready, done;
188
+ };
189
+
190
+ static struct thread_t threads[16];
191
+ static void execute_call(int call);
192
+ static int running;
193
+
194
+ static void* thr(void* arg)
195
+ {
196
+ struct thread_t* th = (struct thread_t*)arg;
197
+ for (;;) {
198
+ event_wait(&th->ready);
199
+ event_reset(&th->ready);
200
+ execute_call(th->call);
201
+ __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
202
+ event_set(&th->done);
203
+ }
204
+ return 0;
205
+ }
206
+
207
+ static void execute_one(void)
208
+ {
209
+ int i, call, thread;
210
+ for (call = 0; call < 3; call++) {
211
+ for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
212
+ thread++) {
213
+ struct thread_t* th = &threads[thread];
214
+ if (!th->created) {
215
+ th->created = 1;
216
+ event_init(&th->ready);
217
+ event_init(&th->done);
218
+ event_set(&th->done);
219
+ thread_start(thr, th);
220
+ }
221
+ if (!event_isset(&th->done))
222
+ continue;
223
+ event_reset(&th->done);
224
+ th->call = call;
225
+ __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
226
+ event_set(&th->ready);
227
+ event_timedwait(&th->done, 45);
228
+ break;
229
+ }
230
+ }
231
+ for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
232
+ sleep_ms(1);
233
+ }
234
+
235
+ static void execute_one(void);
236
+
237
+ #define WAIT_FLAGS __WALL
238
+
239
+ static void loop(void)
240
+ {
241
+ int iter;
242
+ for (iter = 0;; iter++) {
243
+ int pid = fork();
244
+ if (pid < 0)
245
+ exit(1);
246
+ if (pid == 0) {
247
+ setup_test();
248
+ execute_one();
249
+ exit(0);
250
+ }
251
+ int status = 0;
252
+ uint64_t start = current_time_ms();
253
+ for (;;) {
254
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
255
+ break;
256
+ sleep_ms(1);
257
+ if (current_time_ms() - start < 5 * 1000)
258
+ continue;
259
+ kill_and_wait(pid, &status);
260
+ break;
261
+ }
262
+ }
263
+ }
264
+
265
+ uint64_t r[1] = {0xffffffffffffffff};
266
+
267
+ void execute_call(int call)
268
+ {
269
+ long res;
270
+ switch (call) {
271
+ case 0:
272
+ *(uint32_t*)0x20000040 = 0;
273
+ *(uint32_t*)0x20000044 = 0;
274
+ *(uint32_t*)0x20000048 = 0;
275
+ *(uint32_t*)0x2000004c = 0;
276
+ *(uint32_t*)0x20000050 = 0;
277
+ *(uint32_t*)0x20000054 = 0;
278
+ *(uint32_t*)0x20000058 = 0;
279
+ *(uint32_t*)0x2000005c = 0;
280
+ *(uint32_t*)0x20000060 = 0;
281
+ *(uint32_t*)0x20000064 = 0;
282
+ *(uint32_t*)0x20000068 = 0;
283
+ *(uint32_t*)0x2000006c = 0;
284
+ *(uint32_t*)0x20000070 = 0;
285
+ *(uint32_t*)0x20000074 = 0;
286
+ *(uint32_t*)0x20000078 = 0;
287
+ *(uint32_t*)0x2000007c = 0;
288
+ *(uint32_t*)0x20000080 = 0;
289
+ *(uint32_t*)0x20000084 = 0;
290
+ *(uint64_t*)0x20000088 = 0;
291
+ *(uint32_t*)0x20000090 = 0;
292
+ *(uint32_t*)0x20000094 = 0;
293
+ *(uint32_t*)0x20000098 = 0;
294
+ *(uint32_t*)0x2000009c = 0;
295
+ *(uint32_t*)0x200000a0 = 0;
296
+ *(uint32_t*)0x200000a4 = 0;
297
+ *(uint32_t*)0x200000a8 = 0;
298
+ *(uint32_t*)0x200000ac = 0;
299
+ *(uint64_t*)0x200000b0 = 0;
300
+ res = __sys_io_uring_setup(0x64, (struct io_uring_params *) 0x20000040UL);
301
+ if (res != -1)
302
+ r[0] = res;
303
+ break;
304
+ case 1:
305
+ __sys_io_uring_register((long)r[0], 0, 0, 0);
306
+ break;
307
+ case 2:
308
+ __sys_io_uring_register((long)r[0], 0, 0, 0);
309
+ break;
310
+ }
311
+ }
312
+
313
+ static void sig_int(int sig)
314
+ {
315
+ exit(0);
316
+ }
317
+
318
+ int main(int argc, char *argv[])
319
+ {
320
+ if (argc > 1)
321
+ return 0;
322
+ signal(SIGINT, sig_int);
323
+ mmap((void *) 0x20000000, 0x1000000, 3, 0x32, -1, 0);
324
+ signal(SIGALRM, sig_int);
325
+ alarm(5);
326
+
327
+ loop();
328
+ return 0;
329
+ }