@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,20 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #ifndef LIBURING_SYSCALL_H
3
+ #define LIBURING_SYSCALL_H
4
+
5
+ #include <signal.h>
6
+
7
+ struct io_uring_params;
8
+
9
+ /*
10
+ * System calls
11
+ */
12
+ int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
13
+ int __sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
14
+ unsigned flags, sigset_t *sig);
15
+ int __sys_io_uring_enter2(int fd, unsigned to_submit, unsigned min_complete,
16
+ unsigned flags, sigset_t *sig, int sz);
17
+ int __sys_io_uring_register(int fd, unsigned int opcode, const void *arg,
18
+ unsigned int nr_args);
19
+
20
+ #endif
@@ -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
+ }