uringmachine 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +85 -0
- data/TODO.md +5 -0
- data/examples/echo_server.rb +18 -40
- data/examples/inout.rb +19 -0
- data/examples/nc.rb +36 -0
- data/ext/um/extconf.rb +6 -15
- data/ext/um/um.c +245 -53
- data/ext/um/um.h +21 -9
- data/ext/um/um_class.c +74 -87
- data/ext/um/um_const.c +184 -0
- data/ext/um/um_op.c +10 -13
- data/ext/um/um_utils.c +48 -3
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +12 -0
- data/test/helper.rb +8 -0
- data/test/test_um.rb +227 -7
- data/vendor/liburing/.github/workflows/build.yml +29 -1
- data/vendor/liburing/.gitignore +1 -0
- data/vendor/liburing/CHANGELOG +15 -0
- data/vendor/liburing/CONTRIBUTING.md +165 -0
- data/vendor/liburing/configure +32 -0
- data/vendor/liburing/examples/Makefile +8 -1
- data/vendor/liburing/examples/kdigest.c +405 -0
- data/vendor/liburing/examples/proxy.c +75 -8
- data/vendor/liburing/liburing.pc.in +1 -1
- data/vendor/liburing/src/Makefile +16 -2
- data/vendor/liburing/src/include/liburing/io_uring.h +31 -0
- data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
- data/vendor/liburing/src/include/liburing.h +31 -4
- data/vendor/liburing/src/liburing-ffi.map +5 -0
- data/vendor/liburing/src/liburing.map +1 -0
- data/vendor/liburing/src/queue.c +3 -0
- data/vendor/liburing/src/register.c +36 -0
- data/vendor/liburing/src/sanitize.c +176 -0
- data/vendor/liburing/src/setup.c +1 -1
- data/vendor/liburing/test/35fa71a030ca.c +7 -0
- data/vendor/liburing/test/500f9fbadef8.c +2 -0
- data/vendor/liburing/test/7ad0e4b2f83c.c +0 -25
- data/vendor/liburing/test/917257daa0fe.c +7 -0
- data/vendor/liburing/test/Makefile +31 -4
- data/vendor/liburing/test/a0908ae19763.c +7 -0
- data/vendor/liburing/test/a4c0b3decb33.c +7 -0
- data/vendor/liburing/test/accept.c +14 -4
- data/vendor/liburing/test/b19062a56726.c +7 -0
- data/vendor/liburing/test/bind-listen.c +2 -2
- data/vendor/liburing/test/buf-ring-nommap.c +10 -3
- data/vendor/liburing/test/buf-ring.c +2 -0
- data/vendor/liburing/test/coredump.c +7 -0
- data/vendor/liburing/test/cq-overflow.c +13 -1
- data/vendor/liburing/test/d4ae271dfaae.c +11 -3
- data/vendor/liburing/test/defer-taskrun.c +2 -2
- data/vendor/liburing/test/defer-tw-timeout.c +4 -1
- data/vendor/liburing/test/defer.c +2 -2
- data/vendor/liburing/test/double-poll-crash.c +1 -1
- data/vendor/liburing/test/eeed8b54e0df.c +2 -0
- data/vendor/liburing/test/eventfd.c +0 -1
- data/vendor/liburing/test/exit-no-cleanup.c +11 -0
- data/vendor/liburing/test/fadvise.c +9 -26
- data/vendor/liburing/test/fdinfo.c +9 -1
- data/vendor/liburing/test/file-register.c +14 -2
- data/vendor/liburing/test/file-update.c +1 -1
- data/vendor/liburing/test/file-verify.c +27 -16
- data/vendor/liburing/test/files-exit-hang-timeout.c +1 -2
- data/vendor/liburing/test/fixed-buf-iter.c +3 -1
- data/vendor/liburing/test/fixed-hugepage.c +12 -1
- data/vendor/liburing/test/fsnotify.c +1 -0
- data/vendor/liburing/test/futex.c +16 -4
- data/vendor/liburing/test/helpers.c +47 -0
- data/vendor/liburing/test/helpers.h +6 -0
- data/vendor/liburing/test/init-mem.c +5 -3
- data/vendor/liburing/test/io-cancel.c +0 -24
- data/vendor/liburing/test/io_uring_passthrough.c +2 -0
- data/vendor/liburing/test/io_uring_register.c +25 -6
- data/vendor/liburing/test/iopoll-leak.c +4 -0
- data/vendor/liburing/test/iopoll-overflow.c +1 -1
- data/vendor/liburing/test/iopoll.c +3 -3
- data/vendor/liburing/test/kallsyms.c +203 -0
- data/vendor/liburing/test/link-timeout.c +159 -0
- data/vendor/liburing/test/linked-defer-close.c +224 -0
- data/vendor/liburing/test/madvise.c +12 -25
- data/vendor/liburing/test/min-timeout-wait.c +0 -25
- data/vendor/liburing/test/min-timeout.c +0 -25
- data/vendor/liburing/test/mkdir.c +6 -0
- data/vendor/liburing/test/msg-ring.c +8 -2
- data/vendor/liburing/test/napi-test.c +15 -2
- data/vendor/liburing/test/no-mmap-inval.c +2 -0
- data/vendor/liburing/test/nop.c +44 -0
- data/vendor/liburing/test/ooo-file-unreg.c +1 -1
- data/vendor/liburing/test/open-close.c +40 -0
- data/vendor/liburing/test/openat2.c +37 -14
- data/vendor/liburing/test/poll-many.c +13 -7
- data/vendor/liburing/test/poll-mshot-update.c +17 -10
- data/vendor/liburing/test/poll-v-poll.c +6 -3
- data/vendor/liburing/test/pollfree.c +148 -0
- data/vendor/liburing/test/read-mshot-empty.c +156 -153
- data/vendor/liburing/test/read-mshot.c +276 -27
- data/vendor/liburing/test/read-write.c +78 -13
- data/vendor/liburing/test/recv-msgall-stream.c +3 -0
- data/vendor/liburing/test/recv-msgall.c +5 -0
- data/vendor/liburing/test/recvsend_bundle-inc.c +680 -0
- data/vendor/liburing/test/recvsend_bundle.c +92 -29
- data/vendor/liburing/test/reg-fd-only.c +14 -4
- data/vendor/liburing/test/regbuf-clone.c +187 -0
- data/vendor/liburing/test/regbuf-merge.c +7 -0
- data/vendor/liburing/test/register-restrictions.c +86 -85
- data/vendor/liburing/test/rename.c +59 -1
- data/vendor/liburing/test/ringbuf-read.c +5 -0
- data/vendor/liburing/test/ringbuf-status.c +5 -1
- data/vendor/liburing/test/runtests.sh +16 -1
- data/vendor/liburing/test/send-zerocopy.c +59 -0
- data/vendor/liburing/test/short-read.c +1 -0
- data/vendor/liburing/test/socket.c +43 -0
- data/vendor/liburing/test/splice.c +3 -1
- data/vendor/liburing/test/sq-poll-dup.c +1 -1
- data/vendor/liburing/test/sq-poll-share.c +2 -0
- data/vendor/liburing/test/sqpoll-disable-exit.c +8 -0
- data/vendor/liburing/test/sqpoll-exit-hang.c +1 -25
- data/vendor/liburing/test/sqpoll-sleep.c +1 -25
- data/vendor/liburing/test/statx.c +89 -0
- data/vendor/liburing/test/stdout.c +2 -0
- data/vendor/liburing/test/submit-and-wait.c +1 -25
- data/vendor/liburing/test/submit-reuse.c +4 -26
- data/vendor/liburing/test/symlink.c +12 -1
- data/vendor/liburing/test/sync-cancel.c +48 -21
- data/vendor/liburing/test/thread-exit.c +5 -0
- data/vendor/liburing/test/timeout-new.c +1 -26
- data/vendor/liburing/test/timeout.c +12 -26
- data/vendor/liburing/test/unlink.c +94 -1
- data/vendor/liburing/test/uring_cmd_ublk.c +1252 -0
- data/vendor/liburing/test/waitid.c +62 -8
- data/vendor/liburing/test/wq-aff.c +35 -0
- data/vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c +46 -0
- data/vendor/liburing/test/xfail_register_buffers_out_of_scope.c +51 -0
- metadata +17 -4
- data/examples/event_loop.rb +0 -69
- data/examples/fibers.rb +0 -105
@@ -0,0 +1,39 @@
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
2
|
+
#ifndef LIBURING_SANITIZE_H
|
3
|
+
#define LIBURING_SANITIZE_H
|
4
|
+
|
5
|
+
#ifdef __cplusplus
|
6
|
+
extern "C" {
|
7
|
+
#endif
|
8
|
+
|
9
|
+
struct io_uring;
|
10
|
+
struct iovec;
|
11
|
+
|
12
|
+
#if defined(CONFIG_USE_SANITIZER)
|
13
|
+
void liburing_sanitize_ring(struct io_uring *ring);
|
14
|
+
void liburing_sanitize_address(const void *addr);
|
15
|
+
void liburing_sanitize_region(const void *addr, unsigned int len);
|
16
|
+
void liburing_sanitize_iovecs(const struct iovec *iovecs, unsigned nr);
|
17
|
+
#else
|
18
|
+
#define __maybe_unused __attribute__((__unused__))
|
19
|
+
static inline void liburing_sanitize_ring(struct io_uring __maybe_unused *ring)
|
20
|
+
{
|
21
|
+
}
|
22
|
+
static inline void liburing_sanitize_address(const void __maybe_unused *addr)
|
23
|
+
{
|
24
|
+
}
|
25
|
+
static inline void liburing_sanitize_region(const void __maybe_unused *addr,
|
26
|
+
unsigned int __maybe_unused len)
|
27
|
+
{
|
28
|
+
}
|
29
|
+
static inline void liburing_sanitize_iovecs(const struct iovec __maybe_unused *iovecs,
|
30
|
+
unsigned __maybe_unused nr)
|
31
|
+
{
|
32
|
+
}
|
33
|
+
#endif
|
34
|
+
|
35
|
+
#ifdef __cplusplus
|
36
|
+
}
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#endif
|
@@ -19,6 +19,7 @@
|
|
19
19
|
#include "liburing/io_uring_version.h"
|
20
20
|
#include "liburing/barrier.h"
|
21
21
|
|
22
|
+
|
22
23
|
#ifndef uring_unlikely
|
23
24
|
#define uring_unlikely(cond) __builtin_expect(!!(cond), 0)
|
24
25
|
#endif
|
@@ -196,6 +197,7 @@ int io_uring_submit_and_wait_min_timeout(struct io_uring *ring,
|
|
196
197
|
unsigned min_wait,
|
197
198
|
sigset_t *sigmask);
|
198
199
|
|
200
|
+
int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src);
|
199
201
|
int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
|
200
202
|
unsigned nr_iovecs);
|
201
203
|
int io_uring_register_buffers_tags(struct io_uring *ring,
|
@@ -232,8 +234,10 @@ int io_uring_register_restrictions(struct io_uring *ring,
|
|
232
234
|
unsigned int nr_res);
|
233
235
|
int io_uring_enable_rings(struct io_uring *ring);
|
234
236
|
int __io_uring_sqring_wait(struct io_uring *ring);
|
237
|
+
#ifdef _GNU_SOURCE
|
235
238
|
int io_uring_register_iowq_aff(struct io_uring *ring, size_t cpusz,
|
236
239
|
const cpu_set_t *mask);
|
240
|
+
#endif
|
237
241
|
int io_uring_unregister_iowq_aff(struct io_uring *ring);
|
238
242
|
int io_uring_register_iowq_max_workers(struct io_uring *ring,
|
239
243
|
unsigned int *values);
|
@@ -301,15 +305,22 @@ int __io_uring_get_cqe(struct io_uring *ring,
|
|
301
305
|
#define io_uring_cqe_index(ring,ptr,mask) \
|
302
306
|
(((ptr) & (mask)) << io_uring_cqe_shift(ring))
|
303
307
|
|
308
|
+
/*
|
309
|
+
* NOTE: we should just get rid of the 'head' being passed in here, it doesn't
|
310
|
+
* serve a purpose anymore. The below is a bit of a work-around to ensure that
|
311
|
+
* the compiler doesn't complain about 'head' being unused (or only written,
|
312
|
+
* never read), as we use a local iterator for both the head and tail tracking.
|
313
|
+
*/
|
304
314
|
#define io_uring_for_each_cqe(ring, head, cqe) \
|
305
315
|
/* \
|
306
316
|
* io_uring_smp_load_acquire() enforces the order of tail \
|
307
317
|
* and CQE reads. \
|
308
318
|
*/ \
|
309
|
-
for (head = *(ring)->cq.khead
|
310
|
-
|
311
|
-
|
312
|
-
|
319
|
+
for (__u32 __HEAD__ = (head) = *(ring)->cq.khead, \
|
320
|
+
__TAIL__ = io_uring_smp_load_acquire((ring)->cq.ktail); \
|
321
|
+
(cqe = ((head) != __TAIL__ ? \
|
322
|
+
&(ring)->cq.cqes[io_uring_cqe_index(ring, __HEAD__, (ring)->cq.ring_mask)] : NULL)); \
|
323
|
+
(head) = ++__HEAD__)
|
313
324
|
|
314
325
|
/*
|
315
326
|
* Must be called after io_uring_for_each_cqe()
|
@@ -734,6 +745,20 @@ IOURINGINLINE void io_uring_prep_openat_direct(struct io_uring_sqe *sqe,
|
|
734
745
|
__io_uring_set_target_fixed_file(sqe, file_index);
|
735
746
|
}
|
736
747
|
|
748
|
+
IOURINGINLINE void io_uring_prep_open(struct io_uring_sqe *sqe,
|
749
|
+
const char *path, int flags, mode_t mode)
|
750
|
+
{
|
751
|
+
io_uring_prep_openat(sqe, AT_FDCWD, path, flags, mode);
|
752
|
+
}
|
753
|
+
|
754
|
+
/* open directly into the fixed file table */
|
755
|
+
IOURINGINLINE void io_uring_prep_open_direct(struct io_uring_sqe *sqe,
|
756
|
+
const char *path, int flags, mode_t mode,
|
757
|
+
unsigned file_index)
|
758
|
+
{
|
759
|
+
io_uring_prep_openat_direct(sqe, AT_FDCWD, path, flags, mode, file_index);
|
760
|
+
}
|
761
|
+
|
737
762
|
IOURINGINLINE void io_uring_prep_close(struct io_uring_sqe *sqe, int fd)
|
738
763
|
{
|
739
764
|
io_uring_prep_rw(IORING_OP_CLOSE, sqe, fd, NULL, 0, 0);
|
@@ -1259,11 +1284,13 @@ IOURINGINLINE void io_uring_prep_fixed_fd_install(struct io_uring_sqe *sqe,
|
|
1259
1284
|
sqe->install_fd_flags = flags;
|
1260
1285
|
}
|
1261
1286
|
|
1287
|
+
#ifdef _GNU_SOURCE
|
1262
1288
|
IOURINGINLINE void io_uring_prep_ftruncate(struct io_uring_sqe *sqe,
|
1263
1289
|
int fd, loff_t len)
|
1264
1290
|
{
|
1265
1291
|
io_uring_prep_rw(IORING_OP_FTRUNCATE, sqe, fd, 0, 0, len);
|
1266
1292
|
}
|
1293
|
+
#endif
|
1267
1294
|
|
1268
1295
|
/*
|
1269
1296
|
* Returns number of unconsumed (if SQPOLL) or unsubmitted entries exist in
|
@@ -208,4 +208,9 @@ LIBURING_2.7 {
|
|
208
208
|
LIBURING_2.8 {
|
209
209
|
global:
|
210
210
|
io_uring_register_clock;
|
211
|
+
io_uring_submit_and_wait_min_timeout;
|
212
|
+
io_uring_wait_cqes_min_timeout;
|
213
|
+
io_uring_clone_buffers;
|
214
|
+
io_uring_prep_open;
|
215
|
+
io_uring_prep_open_direct;
|
211
216
|
} LIBURING_2.7;
|
data/vendor/liburing/src/queue.c
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
#include "syscall.h"
|
6
6
|
#include "liburing.h"
|
7
7
|
#include "int_flags.h"
|
8
|
+
#include "liburing/sanitize.h"
|
8
9
|
#include "liburing/compat.h"
|
9
10
|
#include "liburing/io_uring.h"
|
10
11
|
|
@@ -405,6 +406,8 @@ static int __io_uring_submit(struct io_uring *ring, unsigned submitted,
|
|
405
406
|
unsigned flags;
|
406
407
|
int ret;
|
407
408
|
|
409
|
+
liburing_sanitize_ring(ring);
|
410
|
+
|
408
411
|
flags = 0;
|
409
412
|
if (sq_ring_needs_enter(ring, submitted, &flags) || cq_needs_enter) {
|
410
413
|
if (cq_needs_enter)
|
@@ -7,12 +7,15 @@
|
|
7
7
|
#include "int_flags.h"
|
8
8
|
#include "liburing/compat.h"
|
9
9
|
#include "liburing/io_uring.h"
|
10
|
+
#include "liburing/sanitize.h"
|
10
11
|
|
11
12
|
static inline int do_register(struct io_uring *ring, unsigned int opcode,
|
12
13
|
const void *arg, unsigned int nr_args)
|
13
14
|
{
|
14
15
|
int fd;
|
15
16
|
|
17
|
+
liburing_sanitize_address(arg);
|
18
|
+
|
16
19
|
if (ring->int_flags & INT_FLAG_REG_REG_RING) {
|
17
20
|
opcode |= IORING_REGISTER_USE_REGISTERED_RING;
|
18
21
|
fd = ring->enter_ring_fd;
|
@@ -28,6 +31,8 @@ int io_uring_register_buffers_update_tag(struct io_uring *ring, unsigned off,
|
|
28
31
|
const __u64 *tags,
|
29
32
|
unsigned nr)
|
30
33
|
{
|
34
|
+
liburing_sanitize_iovecs(iovecs, nr);
|
35
|
+
|
31
36
|
struct io_uring_rsrc_update2 up = {
|
32
37
|
.offset = off,
|
33
38
|
.data = (unsigned long)iovecs,
|
@@ -43,6 +48,8 @@ int io_uring_register_buffers_tags(struct io_uring *ring,
|
|
43
48
|
const __u64 *tags,
|
44
49
|
unsigned nr)
|
45
50
|
{
|
51
|
+
liburing_sanitize_iovecs(iovecs, nr);
|
52
|
+
|
46
53
|
struct io_uring_rsrc_register reg = {
|
47
54
|
.nr = nr,
|
48
55
|
.data = (unsigned long)iovecs,
|
@@ -65,6 +72,8 @@ int io_uring_register_buffers_sparse(struct io_uring *ring, unsigned nr)
|
|
65
72
|
int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
|
66
73
|
unsigned nr_iovecs)
|
67
74
|
{
|
75
|
+
liburing_sanitize_iovecs(iovecs, nr_iovecs);
|
76
|
+
|
68
77
|
return do_register(ring, IORING_REGISTER_BUFFERS, iovecs, nr_iovecs);
|
69
78
|
}
|
70
79
|
|
@@ -77,6 +86,9 @@ int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
|
|
77
86
|
const int *files, const __u64 *tags,
|
78
87
|
unsigned nr_files)
|
79
88
|
{
|
89
|
+
liburing_sanitize_address(files);
|
90
|
+
liburing_sanitize_address(tags);
|
91
|
+
|
80
92
|
struct io_uring_rsrc_update2 up = {
|
81
93
|
.offset = off,
|
82
94
|
.data = (unsigned long)files,
|
@@ -97,6 +109,8 @@ int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
|
|
97
109
|
int io_uring_register_files_update(struct io_uring *ring, unsigned off,
|
98
110
|
const int *files, unsigned nr_files)
|
99
111
|
{
|
112
|
+
liburing_sanitize_address(files);
|
113
|
+
|
100
114
|
struct io_uring_files_update up = {
|
101
115
|
.offset = off,
|
102
116
|
.fds = (unsigned long) files,
|
@@ -148,6 +162,9 @@ int io_uring_register_files_sparse(struct io_uring *ring, unsigned nr)
|
|
148
162
|
int io_uring_register_files_tags(struct io_uring *ring, const int *files,
|
149
163
|
const __u64 *tags, unsigned nr)
|
150
164
|
{
|
165
|
+
liburing_sanitize_address(files);
|
166
|
+
liburing_sanitize_address(tags);
|
167
|
+
|
151
168
|
struct io_uring_rsrc_register reg = {
|
152
169
|
.nr = nr,
|
153
170
|
.data = (unsigned long)files,
|
@@ -175,6 +192,8 @@ int io_uring_register_files(struct io_uring *ring, const int *files,
|
|
175
192
|
{
|
176
193
|
int ret, did_increase = 0;
|
177
194
|
|
195
|
+
liburing_sanitize_address(files);
|
196
|
+
|
178
197
|
do {
|
179
198
|
ret = do_register(ring, IORING_REGISTER_FILES, files, nr_files);
|
180
199
|
if (ret >= 0)
|
@@ -316,6 +335,7 @@ int io_uring_register_buf_ring(struct io_uring *ring,
|
|
316
335
|
struct io_uring_buf_reg *reg,
|
317
336
|
unsigned int __maybe_unused flags)
|
318
337
|
{
|
338
|
+
reg->flags |= flags;
|
319
339
|
return do_register(ring, IORING_REGISTER_PBUF_RING, reg, 1);
|
320
340
|
}
|
321
341
|
|
@@ -328,6 +348,8 @@ int io_uring_unregister_buf_ring(struct io_uring *ring, int bgid)
|
|
328
348
|
|
329
349
|
int io_uring_buf_ring_head(struct io_uring *ring, int buf_group, uint16_t *head)
|
330
350
|
{
|
351
|
+
liburing_sanitize_address(head);
|
352
|
+
|
331
353
|
struct io_uring_buf_status buf_status = {
|
332
354
|
.buf_group = buf_group,
|
333
355
|
};
|
@@ -372,3 +394,17 @@ int io_uring_register_clock(struct io_uring *ring,
|
|
372
394
|
{
|
373
395
|
return do_register(ring, IORING_REGISTER_CLOCK, arg, 0);
|
374
396
|
}
|
397
|
+
|
398
|
+
int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src)
|
399
|
+
{
|
400
|
+
struct io_uring_clone_buffers buf = { .src_fd = src->ring_fd, };
|
401
|
+
|
402
|
+
if (src->int_flags & INT_FLAG_REG_REG_RING) {
|
403
|
+
buf.src_fd = src->enter_ring_fd;
|
404
|
+
buf.flags = IORING_REGISTER_SRC_REGISTERED;
|
405
|
+
} else {
|
406
|
+
buf.src_fd = src->ring_fd;
|
407
|
+
}
|
408
|
+
|
409
|
+
return do_register(dst, IORING_REGISTER_CLONE_BUFFERS, &buf, 1);
|
410
|
+
}
|
@@ -0,0 +1,176 @@
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
2
|
+
|
3
|
+
#include "liburing/sanitize.h"
|
4
|
+
|
5
|
+
#include <sanitizer/asan_interface.h>
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include "liburing.h"
|
8
|
+
|
9
|
+
static inline void sanitize_sqe_addr(struct io_uring_sqe *sqe)
|
10
|
+
{
|
11
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr) != 0) {
|
12
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr);
|
13
|
+
exit(1);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
static inline void sanitize_sqe_optval(struct io_uring_sqe *sqe)
|
17
|
+
{
|
18
|
+
if (__asan_region_is_poisoned((void *) (unsigned long) sqe->optval, sqe->optlen) != 0) {
|
19
|
+
__asan_describe_address((void *) (unsigned long) sqe->optval);
|
20
|
+
exit(1);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
static inline void sanitize_sqe_addr2(struct io_uring_sqe *sqe)
|
24
|
+
{
|
25
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr2) != 0) {
|
26
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr2);
|
27
|
+
exit(1);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
static inline void sanitize_sqe_addr3(struct io_uring_sqe *sqe)
|
31
|
+
{
|
32
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr3) != 0) {
|
33
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr3);
|
34
|
+
exit(1);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
static inline void sanitize_sqe_addr_and_add2(struct io_uring_sqe *sqe)
|
38
|
+
{
|
39
|
+
sanitize_sqe_addr(sqe);
|
40
|
+
sanitize_sqe_addr2(sqe);
|
41
|
+
}
|
42
|
+
static inline void sanitize_sqe_addr_and_add3(struct io_uring_sqe *sqe)
|
43
|
+
{
|
44
|
+
sanitize_sqe_addr(sqe);
|
45
|
+
sanitize_sqe_addr3(sqe);
|
46
|
+
}
|
47
|
+
static inline void sanitize_sqe_nop(struct io_uring_sqe *sqe)
|
48
|
+
{
|
49
|
+
}
|
50
|
+
|
51
|
+
typedef void (*sanitize_sqe_handler)(struct io_uring_sqe *sqe);
|
52
|
+
sanitize_sqe_handler sanitize_handlers[IORING_OP_LAST];
|
53
|
+
bool sanitize_handlers_initialized = false;
|
54
|
+
|
55
|
+
static inline void initialize_sanitize_handlers()
|
56
|
+
{
|
57
|
+
if (sanitize_handlers_initialized)
|
58
|
+
return;
|
59
|
+
|
60
|
+
sanitize_handlers[IORING_OP_NOP] = sanitize_sqe_nop;
|
61
|
+
sanitize_handlers[IORING_OP_READV] = sanitize_sqe_addr;
|
62
|
+
sanitize_handlers[IORING_OP_WRITEV] = sanitize_sqe_addr;
|
63
|
+
sanitize_handlers[IORING_OP_FSYNC] = sanitize_sqe_addr;
|
64
|
+
sanitize_handlers[IORING_OP_READ_FIXED] = sanitize_sqe_addr;
|
65
|
+
sanitize_handlers[IORING_OP_WRITE_FIXED] = sanitize_sqe_addr;
|
66
|
+
sanitize_handlers[IORING_OP_POLL_ADD] = sanitize_sqe_addr;
|
67
|
+
sanitize_handlers[IORING_OP_POLL_REMOVE] = sanitize_sqe_nop;
|
68
|
+
sanitize_handlers[IORING_OP_SYNC_FILE_RANGE] = sanitize_sqe_addr;
|
69
|
+
sanitize_handlers[IORING_OP_SENDMSG] = sanitize_sqe_addr;
|
70
|
+
sanitize_handlers[IORING_OP_RECVMSG] = sanitize_sqe_addr;
|
71
|
+
sanitize_handlers[IORING_OP_TIMEOUT] = sanitize_sqe_addr;
|
72
|
+
sanitize_handlers[IORING_OP_TIMEOUT_REMOVE] = sanitize_sqe_nop;
|
73
|
+
sanitize_handlers[IORING_OP_ACCEPT] = sanitize_sqe_addr;
|
74
|
+
sanitize_handlers[IORING_OP_ASYNC_CANCEL] = sanitize_sqe_nop;
|
75
|
+
sanitize_handlers[IORING_OP_LINK_TIMEOUT] = sanitize_sqe_addr;
|
76
|
+
sanitize_handlers[IORING_OP_CONNECT] = sanitize_sqe_addr;
|
77
|
+
sanitize_handlers[IORING_OP_FALLOCATE] = sanitize_sqe_nop;
|
78
|
+
sanitize_handlers[IORING_OP_OPENAT] = sanitize_sqe_addr;
|
79
|
+
sanitize_handlers[IORING_OP_CLOSE] = sanitize_sqe_addr;
|
80
|
+
sanitize_handlers[IORING_OP_FILES_UPDATE] = sanitize_sqe_addr;
|
81
|
+
sanitize_handlers[IORING_OP_STATX] = sanitize_sqe_addr;
|
82
|
+
sanitize_handlers[IORING_OP_READ] = sanitize_sqe_addr;
|
83
|
+
sanitize_handlers[IORING_OP_WRITE] = sanitize_sqe_addr;
|
84
|
+
sanitize_handlers[IORING_OP_FADVISE] = sanitize_sqe_nop;
|
85
|
+
sanitize_handlers[IORING_OP_MADVISE] = sanitize_sqe_addr;
|
86
|
+
sanitize_handlers[IORING_OP_SEND] = sanitize_sqe_addr_and_add2;
|
87
|
+
sanitize_handlers[IORING_OP_RECV] = sanitize_sqe_addr;
|
88
|
+
sanitize_handlers[IORING_OP_OPENAT2] = sanitize_sqe_addr;
|
89
|
+
sanitize_handlers[IORING_OP_EPOLL_CTL] = sanitize_sqe_addr;
|
90
|
+
sanitize_handlers[IORING_OP_SPLICE] = sanitize_sqe_nop;
|
91
|
+
sanitize_handlers[IORING_OP_PROVIDE_BUFFERS] = sanitize_sqe_addr;
|
92
|
+
sanitize_handlers[IORING_OP_REMOVE_BUFFERS] = sanitize_sqe_addr;
|
93
|
+
sanitize_handlers[IORING_OP_TEE] = sanitize_sqe_nop;
|
94
|
+
sanitize_handlers[IORING_OP_SHUTDOWN] = sanitize_sqe_addr;
|
95
|
+
sanitize_handlers[IORING_OP_RENAMEAT] = sanitize_sqe_addr;
|
96
|
+
sanitize_handlers[IORING_OP_UNLINKAT] = sanitize_sqe_addr;
|
97
|
+
sanitize_handlers[IORING_OP_MKDIRAT] = sanitize_sqe_addr;
|
98
|
+
sanitize_handlers[IORING_OP_SYMLINKAT] = sanitize_sqe_addr;
|
99
|
+
sanitize_handlers[IORING_OP_LINKAT] = sanitize_sqe_addr;
|
100
|
+
sanitize_handlers[IORING_OP_MSG_RING] = sanitize_sqe_addr_and_add3;
|
101
|
+
sanitize_handlers[IORING_OP_FSETXATTR] = sanitize_sqe_addr;
|
102
|
+
sanitize_handlers[IORING_OP_SETXATTR] = sanitize_sqe_addr_and_add3;
|
103
|
+
sanitize_handlers[IORING_OP_FGETXATTR] = sanitize_sqe_addr;
|
104
|
+
sanitize_handlers[IORING_OP_GETXATTR] = sanitize_sqe_addr_and_add3;
|
105
|
+
sanitize_handlers[IORING_OP_SOCKET] = sanitize_sqe_addr;
|
106
|
+
sanitize_handlers[IORING_OP_URING_CMD] = sanitize_sqe_optval;
|
107
|
+
sanitize_handlers[IORING_OP_SEND_ZC] = sanitize_sqe_addr;
|
108
|
+
sanitize_handlers[IORING_OP_SENDMSG_ZC] = sanitize_sqe_addr;
|
109
|
+
sanitize_handlers[IORING_OP_READ_MULTISHOT] = sanitize_sqe_addr;
|
110
|
+
sanitize_handlers[IORING_OP_WAITID] = sanitize_sqe_addr_and_add2;
|
111
|
+
sanitize_handlers[IORING_OP_FUTEX_WAIT] = sanitize_sqe_addr;
|
112
|
+
sanitize_handlers[IORING_OP_FUTEX_WAKE] = sanitize_sqe_addr;
|
113
|
+
sanitize_handlers[IORING_OP_FUTEX_WAITV] = sanitize_sqe_addr;
|
114
|
+
sanitize_handlers[IORING_OP_FIXED_FD_INSTALL] = sanitize_sqe_addr;
|
115
|
+
sanitize_handlers[IORING_OP_FTRUNCATE] = sanitize_sqe_addr;
|
116
|
+
sanitize_handlers[IORING_OP_BIND] = sanitize_sqe_addr;
|
117
|
+
sanitize_handlers[IORING_OP_LISTEN] = sanitize_sqe_addr;
|
118
|
+
sanitize_handlers_initialized = true;
|
119
|
+
}
|
120
|
+
|
121
|
+
void liburing_sanitize_ring(struct io_uring *ring)
|
122
|
+
{
|
123
|
+
struct io_uring_sq *sq = &ring->sq;
|
124
|
+
struct io_uring_sqe *sqe;
|
125
|
+
unsigned int head;
|
126
|
+
int shift = 0;
|
127
|
+
|
128
|
+
initialize_sanitize_handlers();
|
129
|
+
|
130
|
+
if (ring->flags & IORING_SETUP_SQE128)
|
131
|
+
shift = 1;
|
132
|
+
if (!(ring->flags & IORING_SETUP_SQPOLL))
|
133
|
+
head = *sq->khead;
|
134
|
+
else
|
135
|
+
head = io_uring_smp_load_acquire(sq->khead);
|
136
|
+
|
137
|
+
while (head != sq->sqe_tail) {
|
138
|
+
sqe = &sq->sqes[(head & sq->ring_mask) << shift];
|
139
|
+
if (sqe->opcode < IORING_OP_LAST)
|
140
|
+
sanitize_handlers[sqe->opcode](sqe);
|
141
|
+
head++;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
void liburing_sanitize_address(const void *addr)
|
146
|
+
{
|
147
|
+
if (__asan_address_is_poisoned(addr) != 0) {
|
148
|
+
__asan_describe_address((void *)addr);
|
149
|
+
exit(1);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
void liburing_sanitize_region(const void *addr, unsigned int len)
|
154
|
+
{
|
155
|
+
if (__asan_region_is_poisoned((void *)addr, len) != 0) {
|
156
|
+
__asan_describe_address((void *)addr);
|
157
|
+
exit(1);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
void liburing_sanitize_iovecs(const struct iovec *iovecs, unsigned nr)
|
162
|
+
{
|
163
|
+
unsigned i;
|
164
|
+
|
165
|
+
if (__asan_address_is_poisoned((void *)iovecs) != 0) {
|
166
|
+
__asan_describe_address((void *)iovecs);
|
167
|
+
exit(1);
|
168
|
+
}
|
169
|
+
|
170
|
+
for (i = 0; i < nr; i++) {
|
171
|
+
if (__asan_region_is_poisoned((void *)iovecs[i].iov_base, iovecs[i].iov_len) != 0) {
|
172
|
+
__asan_describe_address((void *)iovecs[i].iov_base);
|
173
|
+
exit(1);
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
data/vendor/liburing/src/setup.c
CHANGED
@@ -433,7 +433,7 @@ __cold void io_uring_queue_exit(struct io_uring *ring)
|
|
433
433
|
struct io_uring_cq *cq = &ring->cq;
|
434
434
|
size_t sqe_size;
|
435
435
|
|
436
|
-
if (!sq->ring_sz) {
|
436
|
+
if (!sq->ring_sz && !(ring->int_flags & INT_FLAG_APP_MEM)) {
|
437
437
|
sqe_size = sizeof(struct io_uring_sqe);
|
438
438
|
if (ring->flags & IORING_SETUP_SQE128)
|
439
439
|
sqe_size += 64;
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#include "helpers.h"
|
29
29
|
#include "../src/syscall.h"
|
30
30
|
|
31
|
+
#ifndef CONFIG_USE_SANITIZER
|
31
32
|
#if !defined(SYS_futex) && defined(SYS_futex_time64)
|
32
33
|
# define SYS_futex SYS_futex_time64
|
33
34
|
#endif
|
@@ -327,3 +328,9 @@ int main(int argc, char *argv[])
|
|
327
328
|
loop();
|
328
329
|
return T_EXIT_PASS;
|
329
330
|
}
|
331
|
+
#else
|
332
|
+
int main(int argc, char *argv[])
|
333
|
+
{
|
334
|
+
return T_EXIT_SKIP;
|
335
|
+
}
|
336
|
+
#endif
|
@@ -78,10 +78,12 @@ int main(int argc, char *argv[])
|
|
78
78
|
|
79
79
|
close(fd);
|
80
80
|
unlink(buf);
|
81
|
+
free(iov.iov_base);
|
81
82
|
return T_EXIT_PASS;
|
82
83
|
err:
|
83
84
|
close(fd);
|
84
85
|
unlink(buf);
|
86
|
+
free(iov.iov_base);
|
85
87
|
return T_EXIT_FAIL;
|
86
88
|
skipped:
|
87
89
|
fprintf(stderr, "Polling not supported in current dir, test skipped\n");
|
@@ -5,31 +5,6 @@
|
|
5
5
|
#include "liburing.h"
|
6
6
|
#include "helpers.h"
|
7
7
|
|
8
|
-
static unsigned long long mtime_since(const struct timeval *s,
|
9
|
-
const struct timeval *e)
|
10
|
-
{
|
11
|
-
long long sec, usec;
|
12
|
-
|
13
|
-
sec = e->tv_sec - s->tv_sec;
|
14
|
-
usec = (e->tv_usec - s->tv_usec);
|
15
|
-
if (sec > 0 && usec < 0) {
|
16
|
-
sec--;
|
17
|
-
usec += 1000000;
|
18
|
-
}
|
19
|
-
|
20
|
-
sec *= 1000;
|
21
|
-
usec /= 1000;
|
22
|
-
return sec + usec;
|
23
|
-
}
|
24
|
-
|
25
|
-
static unsigned long long mtime_since_now(struct timeval *tv)
|
26
|
-
{
|
27
|
-
struct timeval end;
|
28
|
-
|
29
|
-
gettimeofday(&end, NULL);
|
30
|
-
return mtime_since(tv, &end);
|
31
|
-
}
|
32
|
-
|
33
8
|
int main(int argc, char *argv[])
|
34
9
|
{
|
35
10
|
struct __kernel_timespec ts1, ts2;
|
@@ -14,6 +14,7 @@
|
|
14
14
|
#include "helpers.h"
|
15
15
|
#include "../src/syscall.h"
|
16
16
|
|
17
|
+
#ifndef CONFIG_USE_SANITIZER
|
17
18
|
int main(int argc, char *argv[])
|
18
19
|
{
|
19
20
|
if (argc > 1)
|
@@ -52,3 +53,9 @@ int main(int argc, char *argv[])
|
|
52
53
|
__sys_io_uring_setup(0x7a6, (struct io_uring_params *) 0x20000000UL);
|
53
54
|
return T_EXIT_PASS;
|
54
55
|
}
|
56
|
+
#else
|
57
|
+
int main(int argc, char *argv[])
|
58
|
+
{
|
59
|
+
return T_EXIT_SKIP;
|
60
|
+
}
|
61
|
+
#endif
|
@@ -27,6 +27,10 @@ ifdef CONFIG_HAVE_ARRAY_BOUNDS
|
|
27
27
|
XCFLAGS += -Warray-bounds=0
|
28
28
|
endif
|
29
29
|
|
30
|
+
ifeq ($(CONFIG_USE_SANITIZER),y)
|
31
|
+
XCFLAGS += -fsanitize=address,undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
32
|
+
endif
|
33
|
+
|
30
34
|
CXXFLAGS ?= $(CFLAGS)
|
31
35
|
override CFLAGS += $(XCFLAGS) -DLIBURING_BUILD_TEST
|
32
36
|
override CXXFLAGS += $(XCFLAGS) -std=c++11 -DLIBURING_BUILD_TEST
|
@@ -114,11 +118,13 @@ test_srcs := \
|
|
114
118
|
io_uring_passthrough.c \
|
115
119
|
io_uring_register.c \
|
116
120
|
io_uring_setup.c \
|
121
|
+
kallsyms.c \
|
117
122
|
lfs-openat.c \
|
118
123
|
lfs-openat-write.c \
|
119
124
|
link.c \
|
120
125
|
link_drain.c \
|
121
126
|
link-timeout.c \
|
127
|
+
linked-defer-close.c \
|
122
128
|
madvise.c \
|
123
129
|
min-timeout.c \
|
124
130
|
min-timeout-wait.c \
|
@@ -130,7 +136,6 @@ test_srcs := \
|
|
130
136
|
multicqes_drain.c \
|
131
137
|
napi-test.c \
|
132
138
|
no-mmap-inval.c \
|
133
|
-
nolibc.c \
|
134
139
|
nop-all-sizes.c \
|
135
140
|
nop.c \
|
136
141
|
ooo-file-unreg.c \
|
@@ -154,6 +159,7 @@ test_srcs := \
|
|
154
159
|
poll-race-mshot.c \
|
155
160
|
poll-ring.c \
|
156
161
|
poll-v-poll.c \
|
162
|
+
pollfree.c \
|
157
163
|
probe.c \
|
158
164
|
read-before-exit.c \
|
159
165
|
read-mshot.c \
|
@@ -165,6 +171,7 @@ test_srcs := \
|
|
165
171
|
reg-fd-only.c \
|
166
172
|
reg-hint.c \
|
167
173
|
reg-reg-ring.c \
|
174
|
+
regbuf-clone.c \
|
168
175
|
regbuf-merge.c \
|
169
176
|
register-restrictions.c \
|
170
177
|
rename.c \
|
@@ -176,6 +183,7 @@ test_srcs := \
|
|
176
183
|
rw_merge_test.c \
|
177
184
|
self.c \
|
178
185
|
recvsend_bundle.c \
|
186
|
+
recvsend_bundle-inc.c \
|
179
187
|
send_recv.c \
|
180
188
|
send_recvmsg.c \
|
181
189
|
send-zerocopy.c \
|
@@ -215,6 +223,7 @@ test_srcs := \
|
|
215
223
|
truncate.c \
|
216
224
|
tty-write-dpoll.c \
|
217
225
|
unlink.c \
|
226
|
+
uring_cmd_ublk.c \
|
218
227
|
version.c \
|
219
228
|
waitid.c \
|
220
229
|
wait-timeout.c \
|
@@ -223,9 +232,19 @@ test_srcs := \
|
|
223
232
|
xattr.c \
|
224
233
|
# EOL
|
225
234
|
|
235
|
+
# Please keep this list sorted alphabetically.
|
236
|
+
asan_test_srcs := \
|
237
|
+
xfail_prep_link_timeout_out_of_scope.c \
|
238
|
+
xfail_register_buffers_out_of_scope.c \
|
239
|
+
# EOL
|
240
|
+
|
226
241
|
all_targets :=
|
227
242
|
include ../Makefile.quiet
|
228
243
|
|
244
|
+
ifeq ($(CONFIG_NOLIBC),y)
|
245
|
+
test_srcs += nolibc.c
|
246
|
+
endif
|
247
|
+
|
229
248
|
ifdef CONFIG_HAVE_STATX
|
230
249
|
test_srcs += statx.c
|
231
250
|
else ifdef CONFIG_HAVE_GLIBC_STATX
|
@@ -246,7 +265,15 @@ test_targets := $(patsubst %,%.t,$(test_targets))
|
|
246
265
|
all_targets += $(test_targets)
|
247
266
|
helpers = helpers.o
|
248
267
|
|
249
|
-
|
268
|
+
ifeq ($(CONFIG_USE_SANITIZER),y)
|
269
|
+
asan_test_targets := $(patsubst %.c,%,$(asan_test_srcs))
|
270
|
+
asan_test_targets := $(patsubst %.cc,%,$(asan_test_targets))
|
271
|
+
asan_run_test_targets := $(patsubst %,%.run_test,$(asan_test_targets))
|
272
|
+
asan_test_targets := $(patsubst %,%.t,$(asan_test_targets))
|
273
|
+
all_targets += $(asan_test_targets)
|
274
|
+
endif
|
275
|
+
|
276
|
+
all: $(test_targets) $(asan_test_targets)
|
250
277
|
|
251
278
|
helpers.o: helpers.c
|
252
279
|
$(QUIET_CC)$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
|
@@ -283,10 +310,10 @@ clean:
|
|
283
310
|
@rm -rf output/
|
284
311
|
|
285
312
|
runtests: all
|
286
|
-
@./runtests.sh $(test_targets)
|
313
|
+
@./runtests.sh $(test_targets) $(asan_test_targets)
|
287
314
|
|
288
315
|
runtests-loop: all
|
289
|
-
@./runtests-loop.sh $(test_targets)
|
316
|
+
@./runtests-loop.sh $(test_targets) $(asan_test_targets)
|
290
317
|
|
291
318
|
%.run_test: %.t
|
292
319
|
@./runtests-quiet.sh $<
|
@@ -14,6 +14,7 @@
|
|
14
14
|
#include "helpers.h"
|
15
15
|
#include "../src/syscall.h"
|
16
16
|
|
17
|
+
#ifndef CONFIG_USE_SANITIZER
|
17
18
|
static uint64_t r[1] = {0xffffffffffffffff};
|
18
19
|
|
19
20
|
int main(int argc, char *argv[])
|
@@ -57,3 +58,9 @@ int main(int argc, char *argv[])
|
|
57
58
|
__sys_io_uring_register(r[0], 2, (const void *) 0x20000280, 1);
|
58
59
|
return T_EXIT_PASS;
|
59
60
|
}
|
61
|
+
#else
|
62
|
+
int main(int argc, char *argv[])
|
63
|
+
{
|
64
|
+
return T_EXIT_SKIP;
|
65
|
+
}
|
66
|
+
#endif
|
@@ -24,6 +24,7 @@
|
|
24
24
|
#include "helpers.h"
|
25
25
|
#include "../src/syscall.h"
|
26
26
|
|
27
|
+
#ifndef CONFIG_USE_SANITIZER
|
27
28
|
static void sleep_ms(uint64_t ms)
|
28
29
|
{
|
29
30
|
usleep(ms * 1000);
|
@@ -179,3 +180,9 @@ int main(int argc, char *argv[])
|
|
179
180
|
loop();
|
180
181
|
return T_EXIT_PASS;
|
181
182
|
}
|
183
|
+
#else
|
184
|
+
int main(int argc, char *argv[])
|
185
|
+
{
|
186
|
+
return T_EXIT_SKIP;
|
187
|
+
}
|
188
|
+
#endif
|