uringmachine 0.1

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 (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
@@ -0,0 +1,312 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: run various openat2(2) tests
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
+ #include <sys/uio.h>
13
+
14
+ #include "helpers.h"
15
+ #include "liburing.h"
16
+
17
+ static int test_openat2(struct io_uring *ring, const char *path, int dfd,
18
+ bool direct, int fixed_index)
19
+ {
20
+ struct io_uring_cqe *cqe;
21
+ struct io_uring_sqe *sqe;
22
+ struct open_how how;
23
+ int ret;
24
+
25
+ sqe = io_uring_get_sqe(ring);
26
+ if (!sqe) {
27
+ fprintf(stderr, "get sqe failed\n");
28
+ return -1;
29
+ }
30
+ memset(&how, 0, sizeof(how));
31
+ how.flags = O_RDWR;
32
+
33
+ if (!direct)
34
+ io_uring_prep_openat2(sqe, dfd, path, &how);
35
+ else
36
+ io_uring_prep_openat2_direct(sqe, dfd, path, &how, fixed_index);
37
+
38
+ ret = io_uring_submit(ring);
39
+ if (ret <= 0) {
40
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
41
+ return -1;
42
+ }
43
+
44
+ ret = io_uring_wait_cqe(ring, &cqe);
45
+ if (ret < 0) {
46
+ fprintf(stderr, "wait completion %d\n", ret);
47
+ return -1;
48
+ }
49
+ ret = cqe->res;
50
+ io_uring_cqe_seen(ring, cqe);
51
+
52
+ if (direct && ret > 0) {
53
+ close(ret);
54
+ return -EINVAL;
55
+ }
56
+ return ret;
57
+ }
58
+
59
+ static int test_open_fixed(const char *path, int dfd)
60
+ {
61
+ struct io_uring_cqe *cqe;
62
+ struct io_uring_sqe *sqe;
63
+ struct io_uring ring;
64
+ const char pattern = 0xac;
65
+ char buffer[] = { 0, 0 };
66
+ int i, ret, fd = -1;
67
+
68
+ ret = io_uring_queue_init(8, &ring, 0);
69
+ if (ret) {
70
+ fprintf(stderr, "ring setup failed\n");
71
+ return -1;
72
+ }
73
+ ret = io_uring_register_files(&ring, &fd, 1);
74
+ if (ret) {
75
+ if (ret == -EINVAL || ret == -EBADF)
76
+ return 0;
77
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
78
+ return -1;
79
+ }
80
+
81
+ ret = test_openat2(&ring, path, dfd, true, 0);
82
+ if (ret == -EINVAL) {
83
+ printf("fixed open isn't supported\n");
84
+ return 1;
85
+ } else if (ret) {
86
+ fprintf(stderr, "direct open failed %d\n", ret);
87
+ return -1;
88
+ }
89
+
90
+ sqe = io_uring_get_sqe(&ring);
91
+ io_uring_prep_write(sqe, 0, &pattern, 1, 0);
92
+ sqe->user_data = 1;
93
+ sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK;
94
+
95
+ sqe = io_uring_get_sqe(&ring);
96
+ io_uring_prep_read(sqe, 0, buffer, 1, 0);
97
+ sqe->user_data = 2;
98
+ sqe->flags |= IOSQE_FIXED_FILE;
99
+
100
+ ret = io_uring_submit(&ring);
101
+ if (ret != 2) {
102
+ fprintf(stderr, "%s: got %d, wanted 2\n", __FUNCTION__, ret);
103
+ return -1;
104
+ }
105
+
106
+ for (i = 0; i < 2; i++) {
107
+ ret = io_uring_wait_cqe(&ring, &cqe);
108
+ if (ret < 0) {
109
+ fprintf(stderr, "wait completion %d\n", ret);
110
+ return -1;
111
+ }
112
+ if (cqe->res != 1) {
113
+ fprintf(stderr, "unexpectetd ret %d\n", cqe->res);
114
+ return -1;
115
+ }
116
+ io_uring_cqe_seen(&ring, cqe);
117
+ }
118
+ if (memcmp(&pattern, buffer, 1) != 0) {
119
+ fprintf(stderr, "buf validation failed\n");
120
+ return -1;
121
+ }
122
+
123
+ io_uring_queue_exit(&ring);
124
+ return 0;
125
+ }
126
+
127
+ static int test_open_fixed_fail(const char *path, int dfd)
128
+ {
129
+ struct io_uring ring;
130
+ int ret, fd = -1;
131
+
132
+ ret = io_uring_queue_init(8, &ring, 0);
133
+ if (ret) {
134
+ fprintf(stderr, "ring setup failed\n");
135
+ return -1;
136
+ }
137
+
138
+ ret = test_openat2(&ring, path, dfd, true, 0);
139
+ if (ret != -ENXIO) {
140
+ fprintf(stderr, "install into not existing table, %i\n", ret);
141
+ return 1;
142
+ }
143
+
144
+ ret = io_uring_register_files(&ring, &fd, 1);
145
+ if (ret) {
146
+ if (ret == -EINVAL || ret == -EBADF)
147
+ return 0;
148
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
149
+ return -1;
150
+ }
151
+
152
+ ret = test_openat2(&ring, path, dfd, true, 1);
153
+ if (ret != -EINVAL) {
154
+ fprintf(stderr, "install out of bounds, %i\n", ret);
155
+ return -1;
156
+ }
157
+
158
+ ret = test_openat2(&ring, path, dfd, true, (1u << 16));
159
+ if (ret != -EINVAL) {
160
+ fprintf(stderr, "install out of bounds or u16 overflow, %i\n", ret);
161
+ return -1;
162
+ }
163
+
164
+ ret = test_openat2(&ring, path, dfd, true, (1u << 16) + 1);
165
+ if (ret != -EINVAL) {
166
+ fprintf(stderr, "install out of bounds or u16 overflow, %i\n", ret);
167
+ return -1;
168
+ }
169
+
170
+ io_uring_queue_exit(&ring);
171
+ return 0;
172
+ }
173
+
174
+ static int test_direct_reinstall(const char *path, int dfd)
175
+ {
176
+ struct io_uring_cqe *cqe;
177
+ struct io_uring_sqe *sqe;
178
+ char buf[1] = { 0xfa };
179
+ struct io_uring ring;
180
+ int ret, pipe_fds[2];
181
+ ssize_t ret2;
182
+
183
+ if (pipe2(pipe_fds, O_NONBLOCK)) {
184
+ fprintf(stderr, "pipe() failed\n");
185
+ return -1;
186
+ }
187
+ ret = io_uring_queue_init(8, &ring, 0);
188
+ if (ret) {
189
+ fprintf(stderr, "ring setup failed\n");
190
+ return -1;
191
+ }
192
+ ret = io_uring_register_files(&ring, pipe_fds, 2);
193
+ if (ret) {
194
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
195
+ return -1;
196
+ }
197
+
198
+ /* reinstall into the second slot */
199
+ ret = test_openat2(&ring, path, dfd, true, 1);
200
+ if (ret != 0) {
201
+ fprintf(stderr, "reinstall failed, %i\n", ret);
202
+ return -1;
203
+ }
204
+
205
+ /* verify it's reinstalled, first write into the slot... */
206
+ sqe = io_uring_get_sqe(&ring);
207
+ io_uring_prep_write(sqe, 1, buf, sizeof(buf), 0);
208
+ sqe->flags |= IOSQE_FIXED_FILE;
209
+
210
+ ret = io_uring_submit(&ring);
211
+ if (ret != 1) {
212
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
213
+ return -1;
214
+ }
215
+ ret = io_uring_wait_cqe(&ring, &cqe);
216
+ if (ret < 0) {
217
+ fprintf(stderr, "wait completion %d\n", ret);
218
+ return ret;
219
+ }
220
+ ret = cqe->res;
221
+ io_uring_cqe_seen(&ring, cqe);
222
+ if (ret != 1) {
223
+ fprintf(stderr, "invalid write %i\n", ret);
224
+ return -1;
225
+ }
226
+
227
+ /* ... and make sure nothing has been written to the pipe */
228
+ ret2 = read(pipe_fds[0], buf, 1);
229
+ if (ret2 != 0 && !(ret2 < 0 && errno == EAGAIN)) {
230
+ fprintf(stderr, "invalid pipe read, %d %d\n", errno, (int)ret2);
231
+ return -1;
232
+ }
233
+
234
+ close(pipe_fds[0]);
235
+ close(pipe_fds[1]);
236
+ io_uring_queue_exit(&ring);
237
+ return 0;
238
+ }
239
+
240
+ int main(int argc, char *argv[])
241
+ {
242
+ struct io_uring ring;
243
+ const char *path, *path_rel;
244
+ int ret, do_unlink;
245
+
246
+ ret = io_uring_queue_init(8, &ring, 0);
247
+ if (ret) {
248
+ fprintf(stderr, "ring setup failed\n");
249
+ return 1;
250
+ }
251
+
252
+ if (argc > 1) {
253
+ path = "/tmp/.open.at2";
254
+ path_rel = argv[1];
255
+ do_unlink = 0;
256
+ } else {
257
+ path = "/tmp/.open.at2";
258
+ path_rel = ".open.at2";
259
+ do_unlink = 1;
260
+ }
261
+
262
+ t_create_file(path, 4096);
263
+
264
+ if (do_unlink)
265
+ t_create_file(path_rel, 4096);
266
+
267
+ ret = test_openat2(&ring, path, -1, false, 0);
268
+ if (ret < 0) {
269
+ if (ret == -EINVAL) {
270
+ fprintf(stdout, "openat2 not supported, skipping\n");
271
+ goto done;
272
+ }
273
+ fprintf(stderr, "test_openat2 absolute failed: %d\n", ret);
274
+ goto err;
275
+ }
276
+
277
+ ret = test_openat2(&ring, path_rel, AT_FDCWD, false, 0);
278
+ if (ret < 0) {
279
+ fprintf(stderr, "test_openat2 relative failed: %d\n", ret);
280
+ goto err;
281
+ }
282
+
283
+ ret = test_open_fixed(path, -1);
284
+ if (ret > 0)
285
+ goto done;
286
+ if (ret) {
287
+ fprintf(stderr, "test_open_fixed failed\n");
288
+ goto err;
289
+ }
290
+ ret = test_open_fixed_fail(path, -1);
291
+ if (ret) {
292
+ fprintf(stderr, "test_open_fixed_fail failed\n");
293
+ goto err;
294
+ }
295
+
296
+ ret = test_direct_reinstall(path, -1);
297
+ if (ret) {
298
+ fprintf(stderr, "test_direct_reinstall failed\n");
299
+ goto err;
300
+ }
301
+
302
+ done:
303
+ unlink(path);
304
+ if (do_unlink)
305
+ unlink(path_rel);
306
+ return 0;
307
+ err:
308
+ unlink(path);
309
+ if (do_unlink)
310
+ unlink(path_rel);
311
+ return 1;
312
+ }
@@ -0,0 +1,204 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test if personalities work
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 "liburing.h"
14
+
15
+ #define FNAME "/tmp/.tmp.access"
16
+ #define USE_UID 1000
17
+
18
+ static int no_personality;
19
+
20
+ static int open_file(struct io_uring *ring, int cred_id, int with_link)
21
+ {
22
+ struct io_uring_cqe *cqe;
23
+ struct io_uring_sqe *sqe;
24
+ int ret, i, to_submit = 1;
25
+
26
+ if (with_link) {
27
+ sqe = io_uring_get_sqe(ring);
28
+ io_uring_prep_nop(sqe);
29
+ sqe->flags |= IOSQE_IO_LINK;
30
+ sqe->user_data = 1;
31
+ to_submit++;
32
+ }
33
+
34
+ sqe = io_uring_get_sqe(ring);
35
+ io_uring_prep_openat(sqe, -1, FNAME, O_RDONLY, 0);
36
+ sqe->user_data = 2;
37
+
38
+ if (cred_id != -1)
39
+ sqe->personality = cred_id;
40
+
41
+ ret = io_uring_submit(ring);
42
+ if (ret != to_submit) {
43
+ fprintf(stderr, "submit got: %d\n", ret);
44
+ goto err;
45
+ }
46
+
47
+ for (i = 0; i < to_submit; i++) {
48
+ ret = io_uring_wait_cqe(ring, &cqe);
49
+ if (ret < 0) {
50
+ fprintf(stderr, "wait completion %d\n", ret);
51
+ goto err;
52
+ }
53
+
54
+ ret = cqe->res;
55
+ io_uring_cqe_seen(ring, cqe);
56
+ }
57
+ err:
58
+ return ret;
59
+ }
60
+
61
+ static int test_personality(struct io_uring *ring)
62
+ {
63
+ int ret, cred_id;
64
+
65
+ ret = io_uring_register_personality(ring);
66
+ if (ret < 0) {
67
+ if (ret == -EINVAL) {
68
+ fprintf(stdout, "Personalities not supported, skipping\n");
69
+ no_personality = 1;
70
+ goto out;
71
+ }
72
+ fprintf(stderr, "register_personality: %d\n", ret);
73
+ goto err;
74
+ }
75
+ cred_id = ret;
76
+
77
+ /* create file only owner can open */
78
+ ret = open(FNAME, O_RDONLY | O_CREAT, 0600);
79
+ if (ret < 0) {
80
+ perror("open");
81
+ goto err;
82
+ }
83
+ close(ret);
84
+
85
+ /* verify we can open it */
86
+ ret = open_file(ring, -1, 0);
87
+ if (ret < 0) {
88
+ fprintf(stderr, "current open got: %d\n", ret);
89
+ goto err;
90
+ }
91
+
92
+ if (seteuid(USE_UID) < 0) {
93
+ fprintf(stdout, "Can't switch to UID %u, skipping\n", USE_UID);
94
+ goto out;
95
+ }
96
+
97
+ /* verify we can't open it with current credentials */
98
+ ret = open_file(ring, -1, 0);
99
+ if (ret != -EACCES) {
100
+ fprintf(stderr, "open got: %d\n", ret);
101
+ goto err;
102
+ }
103
+
104
+ /* verify we can open with registered credentials */
105
+ ret = open_file(ring, cred_id, 0);
106
+ if (ret < 0) {
107
+ fprintf(stderr, "credential open: %d\n", ret);
108
+ goto err;
109
+ }
110
+ close(ret);
111
+
112
+ /* verify we can open with registered credentials and as a link */
113
+ ret = open_file(ring, cred_id, 1);
114
+ if (ret < 0) {
115
+ fprintf(stderr, "credential open: %d\n", ret);
116
+ goto err;
117
+ }
118
+
119
+ if (seteuid(0))
120
+ perror("seteuid");
121
+
122
+ ret = io_uring_unregister_personality(ring, cred_id);
123
+ if (ret) {
124
+ fprintf(stderr, "register_personality: %d\n", ret);
125
+ goto err;
126
+ }
127
+
128
+ out:
129
+ unlink(FNAME);
130
+ return 0;
131
+ err:
132
+ unlink(FNAME);
133
+ return 1;
134
+ }
135
+
136
+ static int test_invalid_personality(struct io_uring *ring)
137
+ {
138
+ int ret;
139
+
140
+ ret = open_file(ring, 2, 0);
141
+ if (ret != -EINVAL) {
142
+ fprintf(stderr, "invalid personality got: %d\n", ret);
143
+ goto err;
144
+ }
145
+ return 0;
146
+ err:
147
+ return 1;
148
+ }
149
+
150
+ static int test_invalid_unregister(struct io_uring *ring)
151
+ {
152
+ int ret;
153
+
154
+ ret = io_uring_unregister_personality(ring, 2);
155
+ if (ret != -EINVAL) {
156
+ fprintf(stderr, "invalid personality unregister got: %d\n", ret);
157
+ goto err;
158
+ }
159
+ return 0;
160
+ err:
161
+ return 1;
162
+ }
163
+
164
+ int main(int argc, char *argv[])
165
+ {
166
+ struct io_uring ring;
167
+ int ret;
168
+
169
+ if (argc > 1)
170
+ return 0;
171
+
172
+ if (geteuid()) {
173
+ fprintf(stderr, "Not root, skipping\n");
174
+ return 0;
175
+ }
176
+
177
+ ret = io_uring_queue_init(8, &ring, 0);
178
+ if (ret) {
179
+ fprintf(stderr, "ring setup failed: %d\n", ret);
180
+ return 1;
181
+ }
182
+
183
+ ret = test_personality(&ring);
184
+ if (ret) {
185
+ fprintf(stderr, "test_personality failed\n");
186
+ return ret;
187
+ }
188
+ if (no_personality)
189
+ return 0;
190
+
191
+ ret = test_invalid_personality(&ring);
192
+ if (ret) {
193
+ fprintf(stderr, "test_invalid_personality failed\n");
194
+ return ret;
195
+ }
196
+
197
+ ret = test_invalid_unregister(&ring);
198
+ if (ret) {
199
+ fprintf(stderr, "test_invalid_unregister failed\n");
200
+ return ret;
201
+ }
202
+
203
+ return 0;
204
+ }
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ /*
4
+ * Description: tests bug fixed in
5
+ * "io_uring: don't gate task_work run on TIF_NOTIFY_SIGNAL"
6
+ *
7
+ * See: https://github.com/axboe/liburing/issues/665
8
+ */
9
+
10
+ #include <stdio.h>
11
+ #include <string.h>
12
+ #include <unistd.h>
13
+
14
+ #include "helpers.h"
15
+ #include "liburing.h"
16
+
17
+ #define CHECK(x) \
18
+ do { \
19
+ if (!(x)) { \
20
+ fprintf(stderr, "%s:%d %s failed\n", __FILE__, __LINE__, #x); \
21
+ return -1; \
22
+ } \
23
+ } while (0)
24
+
25
+ static int pipe_bug(void)
26
+ {
27
+ struct io_uring_params p;
28
+ struct io_uring ring;
29
+ struct io_uring_sqe *sqe;
30
+ struct io_uring_cqe *cqe;
31
+ char buf[1024];
32
+ int fds[2];
33
+ struct __kernel_timespec to = {
34
+ .tv_sec = 1
35
+ };
36
+
37
+ CHECK(pipe(fds) == 0);
38
+
39
+ memset(&p, 0, sizeof(p));
40
+ CHECK(t_create_ring_params(8, &ring, &p) == 0);
41
+
42
+ /* WRITE */
43
+ sqe = io_uring_get_sqe(&ring);
44
+ CHECK(sqe);
45
+ io_uring_prep_write(sqe, fds[1], "foobar", strlen("foobar"), 0); /* or -1 */
46
+ CHECK(io_uring_submit(&ring) == 1);
47
+ CHECK(io_uring_wait_cqe(&ring, &cqe) == 0);
48
+
49
+ io_uring_cqe_seen(&ring, cqe);
50
+
51
+ /* CLOSE */
52
+ sqe = io_uring_get_sqe(&ring);
53
+ CHECK(sqe);
54
+ io_uring_prep_close(sqe, fds[1]);
55
+ CHECK(io_uring_submit(&ring) == 1);
56
+ CHECK(io_uring_wait_cqe_timeout(&ring, &cqe, &to) == 0);
57
+ io_uring_cqe_seen(&ring, cqe);
58
+
59
+ /* READ */
60
+ sqe = io_uring_get_sqe(&ring);
61
+ CHECK(sqe);
62
+ io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0); /* or -1 */
63
+ CHECK(io_uring_submit(&ring) == 1);
64
+ CHECK(io_uring_wait_cqe_timeout(&ring, &cqe, &to) == 0);
65
+ io_uring_cqe_seen(&ring, cqe);
66
+ memset(buf, 0, sizeof(buf));
67
+
68
+ /* READ */
69
+ sqe = io_uring_get_sqe(&ring);
70
+ CHECK(sqe);
71
+ io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0); /* or -1 */
72
+ CHECK(io_uring_submit(&ring) == 1);
73
+ CHECK(io_uring_wait_cqe_timeout(&ring, &cqe, &to) == 0);
74
+ io_uring_cqe_seen(&ring, cqe);
75
+
76
+ close(fds[0]);
77
+ io_uring_queue_exit(&ring);
78
+
79
+ return 0;
80
+ }
81
+
82
+ int main(int argc, char *argv[])
83
+ {
84
+ int i;
85
+
86
+ if (argc > 1)
87
+ return T_EXIT_SKIP;
88
+
89
+ for (i = 0; i < 10000; i++) {
90
+ if (pipe_bug())
91
+ return T_EXIT_FAIL;
92
+ }
93
+
94
+ return T_EXIT_PASS;
95
+ }
@@ -0,0 +1,83 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ /*
4
+ * Test that closed pipe reads returns 0, instead of waiting for more
5
+ * data.
6
+ */
7
+ #include <errno.h>
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+ #include <unistd.h>
11
+ #include <pthread.h>
12
+ #include <string.h>
13
+ #include "liburing.h"
14
+
15
+ #define BUFSIZE 512
16
+
17
+ struct data {
18
+ char *str;
19
+ int fds[2];
20
+ };
21
+
22
+ static void *t(void *data)
23
+ {
24
+ struct data *d = data;
25
+ int ret;
26
+
27
+ strcpy(d->str, "This is a test string");
28
+ ret = write(d->fds[1], d->str, strlen(d->str));
29
+ close(d->fds[1]);
30
+ if (ret < 0)
31
+ perror("write");
32
+
33
+ return NULL;
34
+ }
35
+
36
+ int main(int argc, char *argv[])
37
+ {
38
+ static char buf[BUFSIZE];
39
+ struct io_uring ring;
40
+ pthread_t thread;
41
+ struct data d;
42
+ int ret;
43
+
44
+ if (pipe(d.fds) < 0) {
45
+ perror("pipe");
46
+ return 1;
47
+ }
48
+ d.str = buf;
49
+
50
+ io_uring_queue_init(8, &ring, 0);
51
+
52
+ pthread_create(&thread, NULL, t, &d);
53
+
54
+ while (1) {
55
+ struct io_uring_sqe *sqe;
56
+ struct io_uring_cqe *cqe;
57
+
58
+ sqe = io_uring_get_sqe(&ring);
59
+ io_uring_prep_read(sqe, d.fds[0], buf, BUFSIZE, 0);
60
+ ret = io_uring_submit(&ring);
61
+ if (ret != 1) {
62
+ fprintf(stderr, "submit: %d\n", ret);
63
+ return 1;
64
+ }
65
+ ret = io_uring_wait_cqe(&ring, &cqe);
66
+ if (ret) {
67
+ fprintf(stderr, "wait: %d\n", ret);
68
+ return 1;
69
+ }
70
+
71
+ if (cqe->res < 0) {
72
+ fprintf(stderr, "Read error: %s\n", strerror(-cqe->res));
73
+ return 1;
74
+ }
75
+ if (cqe->res == 0)
76
+ break;
77
+ io_uring_cqe_seen(&ring, cqe);
78
+ }
79
+
80
+ pthread_join(thread, NULL);
81
+ io_uring_queue_exit(&ring);
82
+ return 0;
83
+ }