html-to-markdown 2.27.1 → 2.27.3

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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +8 -8
  3. data/ext/html-to-markdown-rb/native/Cargo.toml +1 -1
  4. data/lib/html_to_markdown/version.rb +1 -1
  5. data/rust-vendor/getrandom/.cargo-checksum.json +1 -1
  6. data/rust-vendor/getrandom/.cargo_vcs_info.json +1 -1
  7. data/rust-vendor/getrandom/CHANGELOG.md +62 -43
  8. data/rust-vendor/getrandom/Cargo.lock +49 -56
  9. data/rust-vendor/getrandom/Cargo.toml +2 -2
  10. data/rust-vendor/getrandom/Cargo.toml.orig +2 -2
  11. data/rust-vendor/getrandom/src/backends/efi_rng.rs +8 -10
  12. data/rust-vendor/getrandom/src/backends/getentropy.rs +13 -4
  13. data/rust-vendor/getrandom/src/backends/linux_android_with_fallback.rs +10 -25
  14. data/rust-vendor/getrandom/src/backends/netbsd.rs +17 -25
  15. data/rust-vendor/getrandom/src/backends/rdrand.rs +15 -9
  16. data/rust-vendor/getrandom/src/backends/rndr.rs +2 -1
  17. data/rust-vendor/getrandom/src/backends/vxworks.rs +7 -3
  18. data/rust-vendor/getrandom/src/backends/windows.rs +21 -5
  19. data/rust-vendor/getrandom/src/utils/lazy_bool.rs +39 -0
  20. data/rust-vendor/getrandom/src/utils/lazy_ptr.rs +57 -0
  21. data/rust-vendor/html-to-markdown-rs/Cargo.toml +2 -2
  22. data/rust-vendor/html-to-markdown-rs/src/converter/plain_text.rs +64 -9
  23. data/rust-vendor/html-to-markdown-rs/src/converter/text_node.rs +2 -1
  24. data/rust-vendor/html-to-markdown-rs/tests/issue_216_217_regressions.rs +82 -0
  25. data/rust-vendor/html-to-markdown-rs/tests/plain_output_test.rs +59 -6
  26. data/rust-vendor/quote/.cargo-checksum.json +1 -1
  27. data/rust-vendor/quote/.cargo_vcs_info.json +1 -1
  28. data/rust-vendor/quote/.github/workflows/ci.yml +2 -2
  29. data/rust-vendor/quote/Cargo.lock +21 -21
  30. data/rust-vendor/quote/Cargo.toml +2 -2
  31. data/rust-vendor/quote/Cargo.toml.orig +2 -2
  32. data/rust-vendor/quote/README.md +0 -1
  33. data/rust-vendor/quote/src/lib.rs +1 -1
  34. data/rust-vendor/quote/src/to_tokens.rs +7 -0
  35. data/rust-vendor/quote/tests/ui/not-quotable.stderr +1 -1
  36. data/rust-vendor/quote/tests/ui/not-repeatable.stderr +3 -11
  37. data/rust-vendor/r-efi/.cargo-checksum.json +1 -1
  38. data/rust-vendor/r-efi/.cargo_vcs_info.json +1 -1
  39. data/rust-vendor/r-efi/AUTHORS +1 -0
  40. data/rust-vendor/r-efi/Cargo.lock +1 -1
  41. data/rust-vendor/r-efi/Cargo.toml +1 -3
  42. data/rust-vendor/r-efi/Cargo.toml.orig +1 -5
  43. data/rust-vendor/r-efi/NEWS.md +16 -0
  44. data/rust-vendor/r-efi/src/base.rs +1 -1
  45. data/rust-vendor/r-efi/src/lib.rs +27 -12
  46. data/rust-vendor/r-efi/src/protocols/absolute_pointer.rs +4 -4
  47. data/rust-vendor/r-efi/src/protocols/block_io.rs +8 -8
  48. data/rust-vendor/r-efi/src/protocols/bus_specific_driver_override.rs +2 -2
  49. data/rust-vendor/r-efi/src/protocols/debug_support.rs +10 -10
  50. data/rust-vendor/r-efi/src/protocols/debugport.rs +8 -8
  51. data/rust-vendor/r-efi/src/protocols/decompress.rs +4 -4
  52. data/rust-vendor/r-efi/src/protocols/device_path_from_text.rs +4 -4
  53. data/rust-vendor/r-efi/src/protocols/device_path_to_text.rs +4 -4
  54. data/rust-vendor/r-efi/src/protocols/device_path_utilities.rs +16 -16
  55. data/rust-vendor/r-efi/src/protocols/disk_io.rs +4 -4
  56. data/rust-vendor/r-efi/src/protocols/disk_io2.rs +8 -8
  57. data/rust-vendor/r-efi/src/protocols/driver_binding.rs +6 -6
  58. data/rust-vendor/r-efi/src/protocols/driver_diagnostics2.rs +2 -2
  59. data/rust-vendor/r-efi/src/protocols/driver_family_override.rs +2 -2
  60. data/rust-vendor/r-efi/src/protocols/file.rs +28 -28
  61. data/rust-vendor/r-efi/src/protocols/graphics_output.rs +6 -6
  62. data/rust-vendor/r-efi/src/protocols/hii_database.rs +24 -24
  63. data/rust-vendor/r-efi/src/protocols/hii_font.rs +8 -8
  64. data/rust-vendor/r-efi/src/protocols/hii_font_ex.rs +10 -10
  65. data/rust-vendor/r-efi/src/protocols/hii_string.rs +10 -10
  66. data/rust-vendor/r-efi/src/protocols/ip4.rs +16 -16
  67. data/rust-vendor/r-efi/src/protocols/ip6.rs +18 -18
  68. data/rust-vendor/r-efi/src/protocols/load_file.rs +2 -2
  69. data/rust-vendor/r-efi/src/protocols/loaded_image.rs +2 -2
  70. data/rust-vendor/r-efi/src/protocols/managed_network.rs +16 -16
  71. data/rust-vendor/r-efi/src/protocols/memory_attribute.rs +6 -6
  72. data/rust-vendor/r-efi/src/protocols/mp_services.rs +15 -15
  73. data/rust-vendor/r-efi/src/protocols/pci_io.rs +26 -26
  74. data/rust-vendor/r-efi/src/protocols/platform_driver_override.rs +6 -6
  75. data/rust-vendor/r-efi/src/protocols/rng.rs +4 -4
  76. data/rust-vendor/r-efi/src/protocols/service_binding.rs +4 -4
  77. data/rust-vendor/r-efi/src/protocols/shell.rs +81 -81
  78. data/rust-vendor/r-efi/src/protocols/shell_dynamic_command.rs +4 -4
  79. data/rust-vendor/r-efi/src/protocols/simple_file_system.rs +2 -2
  80. data/rust-vendor/r-efi/src/protocols/simple_network.rs +26 -26
  81. data/rust-vendor/r-efi/src/protocols/simple_text_input.rs +4 -4
  82. data/rust-vendor/r-efi/src/protocols/simple_text_input_ex.rs +11 -11
  83. data/rust-vendor/r-efi/src/protocols/simple_text_output.rs +18 -18
  84. data/rust-vendor/r-efi/src/protocols/tcp4.rs +20 -20
  85. data/rust-vendor/r-efi/src/protocols/tcp6.rs +18 -18
  86. data/rust-vendor/r-efi/src/protocols/timestamp.rs +3 -3
  87. data/rust-vendor/r-efi/src/protocols/udp4.rs +16 -16
  88. data/rust-vendor/r-efi/src/protocols/udp6.rs +14 -14
  89. data/rust-vendor/r-efi/src/system.rs +115 -115
  90. data/rust-vendor/r-efi/src/vendor/intel/console_control.rs +6 -6
  91. data/rust-vendor/r-efi-5.3.0/.cargo-checksum.json +1 -0
  92. data/rust-vendor/r-efi-5.3.0/.cargo_vcs_info.json +6 -0
  93. data/rust-vendor/r-efi-5.3.0/.github/workflows/publish.yml +39 -0
  94. data/rust-vendor/r-efi-5.3.0/.github/workflows/rust-tests.yml +125 -0
  95. data/rust-vendor/r-efi-5.3.0/AUTHORS +74 -0
  96. data/rust-vendor/r-efi-5.3.0/Cargo.lock +16 -0
  97. data/rust-vendor/r-efi-5.3.0/Cargo.toml +70 -0
  98. data/rust-vendor/r-efi-5.3.0/Cargo.toml.orig +51 -0
  99. data/rust-vendor/r-efi-5.3.0/Makefile +85 -0
  100. data/rust-vendor/r-efi-5.3.0/NEWS.md +301 -0
  101. data/rust-vendor/r-efi-5.3.0/README.md +99 -0
  102. data/rust-vendor/r-efi-5.3.0/examples/freestanding.rs +34 -0
  103. data/rust-vendor/r-efi-5.3.0/examples/gop-query.rs +188 -0
  104. data/rust-vendor/r-efi-5.3.0/examples/hello-world.rs +55 -0
  105. data/rust-vendor/r-efi-5.3.0/src/base.rs +993 -0
  106. data/rust-vendor/r-efi-5.3.0/src/hii.rs +1300 -0
  107. data/rust-vendor/r-efi-5.3.0/src/lib.rs +182 -0
  108. data/rust-vendor/r-efi-5.3.0/src/protocols/absolute_pointer.rs +69 -0
  109. data/rust-vendor/r-efi-5.3.0/src/protocols/block_io.rs +70 -0
  110. data/rust-vendor/r-efi-5.3.0/src/protocols/bus_specific_driver_override.rs +32 -0
  111. data/rust-vendor/r-efi-5.3.0/src/protocols/debug_support.rs +835 -0
  112. data/rust-vendor/r-efi-5.3.0/src/protocols/debugport.rs +42 -0
  113. data/rust-vendor/r-efi-5.3.0/src/protocols/decompress.rs +37 -0
  114. data/rust-vendor/r-efi-5.3.0/src/protocols/device_path.rs +82 -0
  115. data/rust-vendor/r-efi-5.3.0/src/protocols/device_path_from_text.rs +26 -0
  116. data/rust-vendor/r-efi-5.3.0/src/protocols/device_path_to_text.rs +30 -0
  117. data/rust-vendor/r-efi-5.3.0/src/protocols/device_path_utilities.rs +63 -0
  118. data/rust-vendor/r-efi-5.3.0/src/protocols/disk_io.rs +40 -0
  119. data/rust-vendor/r-efi-5.3.0/src/protocols/disk_io2.rs +58 -0
  120. data/rust-vendor/r-efi-5.3.0/src/protocols/driver_binding.rs +42 -0
  121. data/rust-vendor/r-efi-5.3.0/src/protocols/driver_diagnostics2.rs +38 -0
  122. data/rust-vendor/r-efi-5.3.0/src/protocols/driver_family_override.rs +23 -0
  123. data/rust-vendor/r-efi-5.3.0/src/protocols/file.rs +183 -0
  124. data/rust-vendor/r-efi-5.3.0/src/protocols/graphics_output.rs +103 -0
  125. data/rust-vendor/r-efi-5.3.0/src/protocols/hii_database.rs +299 -0
  126. data/rust-vendor/r-efi-5.3.0/src/protocols/hii_font.rs +87 -0
  127. data/rust-vendor/r-efi-5.3.0/src/protocols/hii_font_ex.rs +107 -0
  128. data/rust-vendor/r-efi-5.3.0/src/protocols/hii_package_list.rs +14 -0
  129. data/rust-vendor/r-efi-5.3.0/src/protocols/hii_string.rs +71 -0
  130. data/rust-vendor/r-efi-5.3.0/src/protocols/ip4.rs +202 -0
  131. data/rust-vendor/r-efi-5.3.0/src/protocols/ip6.rs +264 -0
  132. data/rust-vendor/r-efi-5.3.0/src/protocols/load_file.rs +26 -0
  133. data/rust-vendor/r-efi-5.3.0/src/protocols/load_file2.rs +15 -0
  134. data/rust-vendor/r-efi-5.3.0/src/protocols/loaded_image.rs +39 -0
  135. data/rust-vendor/r-efi-5.3.0/src/protocols/loaded_image_device_path.rs +13 -0
  136. data/rust-vendor/r-efi-5.3.0/src/protocols/managed_network.rs +147 -0
  137. data/rust-vendor/r-efi-5.3.0/src/protocols/memory_attribute.rs +40 -0
  138. data/rust-vendor/r-efi-5.3.0/src/protocols/mp_services.rs +121 -0
  139. data/rust-vendor/r-efi-5.3.0/src/protocols/pci_io.rs +203 -0
  140. data/rust-vendor/r-efi-5.3.0/src/protocols/platform_driver_override.rs +46 -0
  141. data/rust-vendor/r-efi-5.3.0/src/protocols/rng.rs +83 -0
  142. data/rust-vendor/r-efi-5.3.0/src/protocols/service_binding.rs +20 -0
  143. data/rust-vendor/r-efi-5.3.0/src/protocols/shell.rs +295 -0
  144. data/rust-vendor/r-efi-5.3.0/src/protocols/shell_dynamic_command.rs +33 -0
  145. data/rust-vendor/r-efi-5.3.0/src/protocols/shell_parameters.rs +23 -0
  146. data/rust-vendor/r-efi-5.3.0/src/protocols/simple_file_system.rs +26 -0
  147. data/rust-vendor/r-efi-5.3.0/src/protocols/simple_network.rs +196 -0
  148. data/rust-vendor/r-efi-5.3.0/src/protocols/simple_text_input.rs +38 -0
  149. data/rust-vendor/r-efi-5.3.0/src/protocols/simple_text_input_ex.rs +85 -0
  150. data/rust-vendor/r-efi-5.3.0/src/protocols/simple_text_output.rs +86 -0
  151. data/rust-vendor/r-efi-5.3.0/src/protocols/tcp4.rs +224 -0
  152. data/rust-vendor/r-efi-5.3.0/src/protocols/tcp6.rs +202 -0
  153. data/rust-vendor/r-efi-5.3.0/src/protocols/timestamp.rs +32 -0
  154. data/rust-vendor/r-efi-5.3.0/src/protocols/udp4.rs +151 -0
  155. data/rust-vendor/r-efi-5.3.0/src/protocols/udp6.rs +137 -0
  156. data/rust-vendor/r-efi-5.3.0/src/protocols.rs +54 -0
  157. data/rust-vendor/r-efi-5.3.0/src/system.rs +1130 -0
  158. data/rust-vendor/r-efi-5.3.0/src/vendor/intel/console_control.rs +37 -0
  159. data/rust-vendor/r-efi-5.3.0/src/vendor.rs +10 -0
  160. data/rust-vendor/tokio/.cargo-checksum.json +1 -1
  161. data/rust-vendor/tokio/.cargo_vcs_info.json +1 -1
  162. data/rust-vendor/tokio/CHANGELOG.md +94 -0
  163. data/rust-vendor/tokio/Cargo.lock +1549 -0
  164. data/rust-vendor/tokio/Cargo.toml +96 -83
  165. data/rust-vendor/tokio/Cargo.toml.orig +7 -7
  166. data/rust-vendor/tokio/README.md +1 -1
  167. data/rust-vendor/tokio/src/fs/open_options.rs +4 -1
  168. data/rust-vendor/tokio/src/fs/read.rs +4 -1
  169. data/rust-vendor/tokio/src/fs/write.rs +4 -1
  170. data/rust-vendor/tokio/src/io/async_write.rs +3 -4
  171. data/rust-vendor/tokio/src/io/poll_evented.rs +23 -1
  172. data/rust-vendor/tokio/src/io/stderr.rs +15 -1
  173. data/rust-vendor/tokio/src/io/stdout.rs +14 -0
  174. data/rust-vendor/tokio/src/io/util/async_write_ext.rs +2 -2
  175. data/rust-vendor/tokio/src/io/util/write_buf.rs +11 -2
  176. data/rust-vendor/tokio/src/lib.rs +12 -28
  177. data/rust-vendor/tokio/src/macros/select.rs +6 -8
  178. data/rust-vendor/tokio/src/net/tcp/socket.rs +25 -1
  179. data/rust-vendor/tokio/src/net/tcp/stream.rs +40 -1
  180. data/rust-vendor/tokio/src/process/unix/pidfd_reaper.rs +1 -41
  181. data/rust-vendor/tokio/src/runtime/blocking/pool.rs +18 -14
  182. data/rust-vendor/tokio/src/runtime/builder.rs +10 -4
  183. data/rust-vendor/tokio/src/runtime/handle.rs +3 -2
  184. data/rust-vendor/tokio/src/runtime/io/driver/uring.rs +49 -61
  185. data/rust-vendor/tokio/src/runtime/io/driver.rs +6 -5
  186. data/rust-vendor/tokio/src/runtime/mod.rs +20 -1
  187. data/rust-vendor/tokio/src/runtime/runtime.rs +71 -1
  188. data/rust-vendor/tokio/src/runtime/scheduler/current_thread/mod.rs +24 -8
  189. data/rust-vendor/tokio/src/runtime/scheduler/multi_thread/worker.rs +5 -0
  190. data/rust-vendor/tokio/src/runtime/task/core.rs +1 -0
  191. data/rust-vendor/tokio/src/runtime/task/join.rs +7 -3
  192. data/rust-vendor/tokio/src/runtime/task/list.rs +5 -3
  193. data/rust-vendor/tokio/src/runtime/task/mod.rs +0 -5
  194. data/rust-vendor/tokio/src/runtime/tests/loom_blocking.rs +39 -1
  195. data/rust-vendor/tokio/src/signal/mod.rs +6 -17
  196. data/rust-vendor/tokio/src/signal/registry.rs +1 -1
  197. data/rust-vendor/tokio/src/signal/unix.rs +24 -44
  198. data/rust-vendor/tokio/src/signal/windows/sys.rs +52 -64
  199. data/rust-vendor/tokio/src/signal/windows.rs +35 -23
  200. data/rust-vendor/tokio/src/sync/mpsc/mod.rs +3 -1
  201. data/rust-vendor/tokio/src/sync/oneshot.rs +13 -0
  202. data/rust-vendor/tokio/src/sync/rwlock.rs +4 -5
  203. data/rust-vendor/tokio/src/sync/tests/loom_oneshot.rs +27 -1
  204. data/rust-vendor/tokio/src/task/blocking.rs +16 -1
  205. data/rust-vendor/tokio/src/task/builder.rs +2 -2
  206. data/rust-vendor/tokio/src/task/mod.rs +1 -1
  207. data/rust-vendor/tokio/src/task/spawn.rs +8 -3
  208. data/rust-vendor/tokio/src/task/yield_now.rs +13 -23
  209. data/rust-vendor/tokio/src/time/clock.rs +62 -0
  210. data/rust-vendor/tokio/src/util/memchr.rs +32 -4
  211. data/rust-vendor/tokio/src/util/sharded_list.rs +6 -4
  212. data/rust-vendor/tokio/tests/fs_link.rs +54 -0
  213. data/rust-vendor/tokio/tests/io_async_fd_memory_leak.rs +209 -0
  214. data/rust-vendor/tokio/tests/io_write_buf.rs +56 -0
  215. data/rust-vendor/tokio/tests/process_issue_7144.rs +8 -0
  216. data/rust-vendor/tokio/tests/rt_basic.rs +41 -0
  217. data/rust-vendor/tokio/tests/rt_common_before_park.rs +92 -0
  218. data/rust-vendor/tokio/tests/rt_metrics.rs +1 -1
  219. data/rust-vendor/tokio/tests/rt_panic.rs +12 -0
  220. data/rust-vendor/tokio/tests/rt_shutdown_err.rs +82 -0
  221. data/rust-vendor/tokio/tests/rt_threaded.rs +49 -1
  222. data/rust-vendor/tokio/tests/rt_unstable_metrics.rs +32 -0
  223. data/rust-vendor/tokio/tests/tcp_connect.rs +2 -3
  224. data/rust-vendor/tokio/tests/tcp_shutdown.rs +1 -3
  225. data/rust-vendor/tokio/tests/tcp_socket.rs +3 -4
  226. data/rust-vendor/tokio/tests/tcp_stream.rs +3 -0
  227. metadata +78 -3
  228. data/rust-vendor/getrandom/src/utils/lazy.rs +0 -64
@@ -4,9 +4,9 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "anyhow"
7
- version = "1.0.100"
7
+ version = "1.0.102"
8
8
  source = "registry+https://github.com/rust-lang/crates.io-index"
9
- checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
9
+ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
10
10
 
11
11
  [[package]]
12
12
  name = "async-trait"
@@ -27,15 +27,15 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
27
27
 
28
28
  [[package]]
29
29
  name = "bitflags"
30
- version = "2.10.0"
30
+ version = "2.11.0"
31
31
  source = "registry+https://github.com/rust-lang/crates.io-index"
32
- checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
32
+ checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
33
33
 
34
34
  [[package]]
35
35
  name = "bumpalo"
36
- version = "3.19.1"
36
+ version = "3.20.2"
37
37
  source = "registry+https://github.com/rust-lang/crates.io-index"
38
- checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
38
+ checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
39
39
 
40
40
  [[package]]
41
41
  name = "cast"
@@ -45,9 +45,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
45
45
 
46
46
  [[package]]
47
47
  name = "cc"
48
- version = "1.2.55"
48
+ version = "1.2.56"
49
49
  source = "registry+https://github.com/rust-lang/crates.io-index"
50
- checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29"
50
+ checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2"
51
51
  dependencies = [
52
52
  "find-msvc-tools",
53
53
  "shlex",
@@ -79,32 +79,31 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
79
79
 
80
80
  [[package]]
81
81
  name = "futures-core"
82
- version = "0.3.31"
82
+ version = "0.3.32"
83
83
  source = "registry+https://github.com/rust-lang/crates.io-index"
84
- checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
84
+ checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
85
85
 
86
86
  [[package]]
87
87
  name = "futures-task"
88
- version = "0.3.31"
88
+ version = "0.3.32"
89
89
  source = "registry+https://github.com/rust-lang/crates.io-index"
90
- checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
90
+ checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
91
91
 
92
92
  [[package]]
93
93
  name = "futures-util"
94
- version = "0.3.31"
94
+ version = "0.3.32"
95
95
  source = "registry+https://github.com/rust-lang/crates.io-index"
96
- checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
96
+ checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
97
97
  dependencies = [
98
98
  "futures-core",
99
99
  "futures-task",
100
100
  "pin-project-lite",
101
- "pin-utils",
102
101
  "slab",
103
102
  ]
104
103
 
105
104
  [[package]]
106
105
  name = "getrandom"
107
- version = "0.4.1"
106
+ version = "0.4.2"
108
107
  dependencies = [
109
108
  "cfg-if",
110
109
  "js-sys",
@@ -164,9 +163,9 @@ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
164
163
 
165
164
  [[package]]
166
165
  name = "js-sys"
167
- version = "0.3.85"
166
+ version = "0.3.91"
168
167
  source = "registry+https://github.com/rust-lang/crates.io-index"
169
- checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
168
+ checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c"
170
169
  dependencies = [
171
170
  "once_cell",
172
171
  "wasm-bindgen",
@@ -180,9 +179,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
180
179
 
181
180
  [[package]]
182
181
  name = "libc"
183
- version = "0.2.180"
182
+ version = "0.2.182"
184
183
  source = "registry+https://github.com/rust-lang/crates.io-index"
185
- checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
184
+ checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
186
185
 
187
186
  [[package]]
188
187
  name = "libm"
@@ -198,9 +197,9 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
198
197
 
199
198
  [[package]]
200
199
  name = "memchr"
201
- version = "2.7.6"
200
+ version = "2.8.0"
202
201
  source = "registry+https://github.com/rust-lang/crates.io-index"
203
- checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
202
+ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
204
203
 
205
204
  [[package]]
206
205
  name = "minicov"
@@ -245,15 +244,9 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
245
244
 
246
245
  [[package]]
247
246
  name = "pin-project-lite"
248
- version = "0.2.16"
249
- source = "registry+https://github.com/rust-lang/crates.io-index"
250
- checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
251
-
252
- [[package]]
253
- name = "pin-utils"
254
- version = "0.1.0"
247
+ version = "0.2.17"
255
248
  source = "registry+https://github.com/rust-lang/crates.io-index"
256
- checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
249
+ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
257
250
 
258
251
  [[package]]
259
252
  name = "prettyplease"
@@ -285,9 +278,9 @@ dependencies = [
285
278
 
286
279
  [[package]]
287
280
  name = "r-efi"
288
- version = "5.3.0"
281
+ version = "6.0.0"
289
282
  source = "registry+https://github.com/rust-lang/crates.io-index"
290
- checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
283
+ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
291
284
 
292
285
  [[package]]
293
286
  name = "rand_core"
@@ -373,9 +366,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
373
366
 
374
367
  [[package]]
375
368
  name = "syn"
376
- version = "2.0.114"
369
+ version = "2.0.117"
377
370
  source = "registry+https://github.com/rust-lang/crates.io-index"
378
- checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
371
+ checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
379
372
  dependencies = [
380
373
  "proc-macro2",
381
374
  "quote",
@@ -384,9 +377,9 @@ dependencies = [
384
377
 
385
378
  [[package]]
386
379
  name = "unicode-ident"
387
- version = "1.0.22"
380
+ version = "1.0.24"
388
381
  source = "registry+https://github.com/rust-lang/crates.io-index"
389
- checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
382
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
390
383
 
391
384
  [[package]]
392
385
  name = "unicode-xid"
@@ -424,9 +417,9 @@ dependencies = [
424
417
 
425
418
  [[package]]
426
419
  name = "wasm-bindgen"
427
- version = "0.2.108"
420
+ version = "0.2.114"
428
421
  source = "registry+https://github.com/rust-lang/crates.io-index"
429
- checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
422
+ checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e"
430
423
  dependencies = [
431
424
  "cfg-if",
432
425
  "once_cell",
@@ -437,9 +430,9 @@ dependencies = [
437
430
 
438
431
  [[package]]
439
432
  name = "wasm-bindgen-futures"
440
- version = "0.4.58"
433
+ version = "0.4.64"
441
434
  source = "registry+https://github.com/rust-lang/crates.io-index"
442
- checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
435
+ checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8"
443
436
  dependencies = [
444
437
  "cfg-if",
445
438
  "futures-util",
@@ -451,9 +444,9 @@ dependencies = [
451
444
 
452
445
  [[package]]
453
446
  name = "wasm-bindgen-macro"
454
- version = "0.2.108"
447
+ version = "0.2.114"
455
448
  source = "registry+https://github.com/rust-lang/crates.io-index"
456
- checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
449
+ checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6"
457
450
  dependencies = [
458
451
  "quote",
459
452
  "wasm-bindgen-macro-support",
@@ -461,9 +454,9 @@ dependencies = [
461
454
 
462
455
  [[package]]
463
456
  name = "wasm-bindgen-macro-support"
464
- version = "0.2.108"
457
+ version = "0.2.114"
465
458
  source = "registry+https://github.com/rust-lang/crates.io-index"
466
- checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
459
+ checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3"
467
460
  dependencies = [
468
461
  "bumpalo",
469
462
  "proc-macro2",
@@ -474,18 +467,18 @@ dependencies = [
474
467
 
475
468
  [[package]]
476
469
  name = "wasm-bindgen-shared"
477
- version = "0.2.108"
470
+ version = "0.2.114"
478
471
  source = "registry+https://github.com/rust-lang/crates.io-index"
479
- checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
472
+ checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16"
480
473
  dependencies = [
481
474
  "unicode-ident",
482
475
  ]
483
476
 
484
477
  [[package]]
485
478
  name = "wasm-bindgen-test"
486
- version = "0.3.58"
479
+ version = "0.3.64"
487
480
  source = "registry+https://github.com/rust-lang/crates.io-index"
488
- checksum = "45649196a53b0b7a15101d845d44d2dda7374fc1b5b5e2bbf58b7577ff4b346d"
481
+ checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe"
489
482
  dependencies = [
490
483
  "async-trait",
491
484
  "cast",
@@ -505,9 +498,9 @@ dependencies = [
505
498
 
506
499
  [[package]]
507
500
  name = "wasm-bindgen-test-macro"
508
- version = "0.3.58"
501
+ version = "0.3.64"
509
502
  source = "registry+https://github.com/rust-lang/crates.io-index"
510
- checksum = "f579cdd0123ac74b94e1a4a72bd963cf30ebac343f2df347da0b8df24cdebed2"
503
+ checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd"
511
504
  dependencies = [
512
505
  "proc-macro2",
513
506
  "quote",
@@ -516,9 +509,9 @@ dependencies = [
516
509
 
517
510
  [[package]]
518
511
  name = "wasm-bindgen-test-shared"
519
- version = "0.2.108"
512
+ version = "0.2.114"
520
513
  source = "registry+https://github.com/rust-lang/crates.io-index"
521
- checksum = "a8145dd1593bf0fb137dbfa85b8be79ec560a447298955877804640e40c2d6ea"
514
+ checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e"
522
515
 
523
516
  [[package]]
524
517
  name = "wasm-encoder"
@@ -556,9 +549,9 @@ dependencies = [
556
549
 
557
550
  [[package]]
558
551
  name = "web-sys"
559
- version = "0.3.85"
552
+ version = "0.3.91"
560
553
  source = "registry+https://github.com/rust-lang/crates.io-index"
561
- checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
554
+ checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9"
562
555
  dependencies = [
563
556
  "js-sys",
564
557
  "wasm-bindgen",
@@ -678,6 +671,6 @@ dependencies = [
678
671
 
679
672
  [[package]]
680
673
  name = "zmij"
681
- version = "1.0.19"
674
+ version = "1.0.21"
682
675
  source = "registry+https://github.com/rust-lang/crates.io-index"
683
- checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"
676
+ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
@@ -13,7 +13,7 @@
13
13
  edition = "2024"
14
14
  rust-version = "1.85"
15
15
  name = "getrandom"
16
- version = "0.4.1"
16
+ version = "0.4.2"
17
17
  authors = ["The Rand Project Developers"]
18
18
  build = "build.rs"
19
19
  exclude = [".*"]
@@ -108,7 +108,7 @@ default-features = false
108
108
  version = "0.4"
109
109
 
110
110
  [target.'cfg(all(target_os = "uefi", getrandom_backend = "efi_rng"))'.dependencies.r-efi]
111
- version = "5.1"
111
+ version = "6"
112
112
  default-features = false
113
113
 
114
114
  [target.'cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm")))'.dependencies.libc]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "getrandom"
3
- version = "0.4.1"
3
+ version = "0.4.2"
4
4
  edition = "2024"
5
5
  rust-version = "1.85" # Sync tests.yml and README.md.
6
6
  authors = ["The Rand Project Developers"]
@@ -50,7 +50,7 @@ libc = { version = "0.2.154", default-features = false }
50
50
 
51
51
  # efi_rng
52
52
  [target.'cfg(all(target_os = "uefi", getrandom_backend = "efi_rng"))'.dependencies]
53
- r-efi = { version = "5.1", default-features = false }
53
+ r-efi = { version = "6", default-features = false }
54
54
 
55
55
  # getentropy
56
56
  [target.'cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten"))'.dependencies]
@@ -2,8 +2,7 @@
2
2
  use crate::Error;
3
3
  use core::{
4
4
  mem::MaybeUninit,
5
- ptr::{self, NonNull, null_mut},
6
- sync::atomic::{AtomicPtr, Ordering::Relaxed},
5
+ ptr::{self, NonNull},
7
6
  };
8
7
  use r_efi::{
9
8
  efi::{BootServices, Handle},
@@ -17,8 +16,6 @@ pub use crate::util::{inner_u32, inner_u64};
17
16
  #[cfg(not(target_os = "uefi"))]
18
17
  compile_error!("`efi_rng` backend can be enabled only for UEFI targets!");
19
18
 
20
- static RNG_PROTOCOL: AtomicPtr<rng::Protocol> = AtomicPtr::new(null_mut());
21
-
22
19
  #[cold]
23
20
  #[inline(never)]
24
21
  fn init() -> Result<NonNull<rng::Protocol>, Error> {
@@ -36,7 +33,7 @@ fn init() -> Result<NonNull<rng::Protocol>, Error> {
36
33
  ((*boot_services.as_ptr()).locate_handle)(
37
34
  r_efi::efi::BY_PROTOCOL,
38
35
  &mut guid,
39
- null_mut(),
36
+ ptr::null_mut(),
40
37
  &mut buf_size,
41
38
  handles.as_mut_ptr(),
42
39
  )
@@ -88,7 +85,6 @@ fn init() -> Result<NonNull<rng::Protocol>, Error> {
88
85
  continue;
89
86
  }
90
87
 
91
- RNG_PROTOCOL.store(protocol.as_ptr(), Relaxed);
92
88
  return Ok(protocol);
93
89
  }
94
90
  Err(Error::NO_RNG_HANDLE)
@@ -96,10 +92,12 @@ fn init() -> Result<NonNull<rng::Protocol>, Error> {
96
92
 
97
93
  #[inline]
98
94
  pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
99
- let protocol = match NonNull::new(RNG_PROTOCOL.load(Relaxed)) {
100
- Some(p) => p,
101
- None => init()?,
102
- };
95
+ #[path = "../utils/lazy_ptr.rs"]
96
+ mod lazy;
97
+
98
+ static RNG_PROTOCOL: lazy::LazyPtr<rng::Protocol> = lazy::LazyPtr::new();
99
+
100
+ let protocol = RNG_PROTOCOL.try_unsync_init(init)?;
103
101
 
104
102
  let mut alg_guid = rng::ALGORITHM_RAW;
105
103
  let ret = unsafe {
@@ -1,5 +1,9 @@
1
1
  //! Implementation using getentropy(2)
2
2
  //!
3
+ //! When porting to a new target, ensure that its implementation follows the
4
+ //! POSIX conventions from
5
+ //! <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getentropy.html>.
6
+ //!
3
7
  //! Available since:
4
8
  //! - macOS 10.12
5
9
  //! - OpenBSD 5.6
@@ -17,11 +21,16 @@ mod utils;
17
21
 
18
22
  #[inline]
19
23
  pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
20
- for chunk in dest.chunks_mut(256) {
24
+ // https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/limits.h.html
25
+ // says `GETENTROPY_MAX` is at least 256.
26
+ const GETENTROPY_MAX: usize = 256;
27
+
28
+ for chunk in dest.chunks_mut(GETENTROPY_MAX) {
21
29
  let ret = unsafe { libc::getentropy(chunk.as_mut_ptr().cast::<c_void>(), chunk.len()) };
22
- if ret != 0 {
23
- let errno = utils::get_errno();
24
- return Err(Error::from_errno(errno));
30
+ match ret {
31
+ 0 => continue,
32
+ -1 => return Err(Error::from_errno(utils::get_errno())),
33
+ _ => return Err(Error::UNEXPECTED),
25
34
  }
26
35
  }
27
36
  Ok(())
@@ -4,8 +4,7 @@ use crate::Error;
4
4
  use core::{
5
5
  ffi::c_void,
6
6
  mem::{MaybeUninit, transmute},
7
- ptr::NonNull,
8
- sync::atomic::{AtomicPtr, Ordering},
7
+ ptr::{self, NonNull},
9
8
  };
10
9
  use use_file::utils;
11
10
 
@@ -17,18 +16,12 @@ type GetRandomFn = unsafe extern "C" fn(*mut c_void, libc::size_t, libc::c_uint)
17
16
  /// or not supported by kernel.
18
17
  const NOT_AVAILABLE: NonNull<c_void> = unsafe { NonNull::new_unchecked(usize::MAX as *mut c_void) };
19
18
 
20
- static GETRANDOM_FN: AtomicPtr<c_void> = AtomicPtr::new(core::ptr::null_mut());
21
-
22
19
  #[cold]
23
20
  #[inline(never)]
24
21
  fn init() -> NonNull<c_void> {
25
22
  // Use static linking to `libc::getrandom` on MUSL targets and `dlsym` everywhere else
26
23
  #[cfg(not(target_env = "musl"))]
27
- let raw_ptr = {
28
- static NAME: &[u8] = b"getrandom\0";
29
- let name_ptr = NAME.as_ptr().cast::<libc::c_char>();
30
- unsafe { libc::dlsym(libc::RTLD_DEFAULT, name_ptr) }
31
- };
24
+ let raw_ptr = unsafe { libc::dlsym(libc::RTLD_DEFAULT, c"getrandom".as_ptr()) };
32
25
  #[cfg(target_env = "musl")]
33
26
  let raw_ptr = {
34
27
  let fptr: GetRandomFn = libc::getrandom;
@@ -37,10 +30,9 @@ fn init() -> NonNull<c_void> {
37
30
 
38
31
  let res_ptr = match NonNull::new(raw_ptr) {
39
32
  Some(fptr) => {
40
- let getrandom_fn = unsafe { transmute::<NonNull<c_void>, GetRandomFn>(fptr) };
41
- let dangling_ptr = NonNull::dangling().as_ptr();
33
+ let getrandom_fn = unsafe { transmute::<*mut c_void, GetRandomFn>(fptr.as_ptr()) };
42
34
  // Check that `getrandom` syscall is supported by kernel
43
- let res = unsafe { getrandom_fn(dangling_ptr, 0, 0) };
35
+ let res = unsafe { getrandom_fn(ptr::dangling_mut(), 0, 0) };
44
36
  if cfg!(getrandom_test_linux_fallback) {
45
37
  NOT_AVAILABLE
46
38
  } else if res.is_negative() {
@@ -65,7 +57,6 @@ fn init() -> NonNull<c_void> {
65
57
  panic!("Fallback is triggered with enabled `getrandom_test_linux_without_fallback`")
66
58
  }
67
59
 
68
- GETRANDOM_FN.store(res_ptr.as_ptr(), Ordering::Release);
69
60
  res_ptr
70
61
  }
71
62
 
@@ -77,23 +68,17 @@ fn use_file_fallback(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
77
68
 
78
69
  #[inline]
79
70
  pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
80
- // Despite being only a single atomic variable, we still cannot always use
81
- // Ordering::Relaxed, as we need to make sure a successful call to `init`
82
- // is "ordered before" any data read through the returned pointer (which
83
- // occurs when the function is called). Our implementation mirrors that of
84
- // the one in libstd, meaning that the use of non-Relaxed operations is
85
- // probably unnecessary.
86
- let raw_ptr = GETRANDOM_FN.load(Ordering::Acquire);
87
- let fptr = match NonNull::new(raw_ptr) {
88
- Some(p) => p,
89
- None => init(),
90
- };
71
+ #[path = "../utils/lazy_ptr.rs"]
72
+ mod lazy;
73
+
74
+ static GETRANDOM_FN: lazy::LazyPtr<c_void> = lazy::LazyPtr::new();
75
+ let fptr = GETRANDOM_FN.unsync_init(init);
91
76
 
92
77
  if fptr == NOT_AVAILABLE {
93
78
  use_file_fallback(dest)
94
79
  } else {
95
80
  // note: `transmute` is currently the only way to convert a pointer into a function reference
96
- let getrandom_fn = unsafe { transmute::<NonNull<c_void>, GetRandomFn>(fptr) };
81
+ let getrandom_fn = unsafe { transmute::<*mut c_void, GetRandomFn>(fptr.as_ptr()) };
97
82
  utils::sys_fill_exact(dest, |buf| unsafe {
98
83
  getrandom_fn(buf.as_mut_ptr().cast(), buf.len(), 0)
99
84
  })
@@ -8,8 +8,7 @@ use core::{
8
8
  cmp,
9
9
  ffi::c_void,
10
10
  mem::{self, MaybeUninit},
11
- ptr,
12
- sync::atomic::{AtomicPtr, Ordering},
11
+ ptr::{self, NonNull},
13
12
  };
14
13
 
15
14
  pub use crate::util::{inner_u32, inner_u64};
@@ -42,36 +41,29 @@ unsafe extern "C" fn polyfill_using_kern_arand(
42
41
 
43
42
  type GetRandomFn = unsafe extern "C" fn(*mut c_void, libc::size_t, libc::c_uint) -> libc::ssize_t;
44
43
 
45
- static GETRANDOM: AtomicPtr<c_void> = AtomicPtr::new(ptr::null_mut());
46
-
47
44
  #[cold]
48
45
  #[inline(never)]
49
- fn init() -> *mut c_void {
50
- static NAME: &[u8] = b"getrandom\0";
51
- let name_ptr = NAME.as_ptr().cast::<libc::c_char>();
52
- let mut ptr = unsafe { libc::dlsym(libc::RTLD_DEFAULT, name_ptr) };
53
- if ptr.is_null() || cfg!(getrandom_test_netbsd_fallback) {
54
- // Verify `polyfill_using_kern_arand` has the right signature.
55
- const POLYFILL: GetRandomFn = polyfill_using_kern_arand;
56
- ptr = POLYFILL as *mut c_void;
46
+ fn init() -> NonNull<c_void> {
47
+ let ptr = unsafe { libc::dlsym(libc::RTLD_DEFAULT, c"getrandom".as_ptr()) };
48
+ if !cfg!(getrandom_test_netbsd_fallback) {
49
+ if let Some(ptr) = NonNull::new(ptr) {
50
+ return ptr;
51
+ }
57
52
  }
58
- GETRANDOM.store(ptr, Ordering::Release);
59
- ptr
53
+ // Verify `polyfill_using_kern_arand` has the right signature.
54
+ const POLYFILL: GetRandomFn = polyfill_using_kern_arand;
55
+ unsafe { NonNull::new_unchecked(POLYFILL as *mut c_void) }
60
56
  }
61
57
 
62
58
  #[inline]
63
59
  pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
64
- // Despite being only a single atomic variable, we still cannot always use
65
- // Ordering::Relaxed, as we need to make sure a successful call to `init`
66
- // is "ordered before" any data read through the returned pointer (which
67
- // occurs when the function is called). Our implementation mirrors that of
68
- // the one in libstd, meaning that the use of non-Relaxed operations is
69
- // probably unnecessary.
70
- let mut fptr = GETRANDOM.load(Ordering::Acquire);
71
- if fptr.is_null() {
72
- fptr = init();
73
- }
74
- let fptr = unsafe { mem::transmute::<*mut c_void, GetRandomFn>(fptr) };
60
+ #[path = "../utils/lazy_ptr.rs"]
61
+ mod lazy;
62
+
63
+ static GETRANDOM_FN: lazy::LazyPtr<c_void> = lazy::LazyPtr::new();
64
+
65
+ let fptr = GETRANDOM_FN.unsync_init(init);
66
+ let fptr = unsafe { mem::transmute::<*mut c_void, GetRandomFn>(fptr.as_ptr()) };
75
67
  utils::sys_fill_exact(dest, |buf| unsafe {
76
68
  fptr(buf.as_mut_ptr().cast::<c_void>(), buf.len(), 0)
77
69
  })
@@ -2,9 +2,6 @@
2
2
  use crate::{Error, util::slice_as_uninit};
3
3
  use core::mem::{MaybeUninit, size_of};
4
4
 
5
- #[path = "../utils/lazy.rs"]
6
- mod lazy;
7
-
8
5
  #[cfg(not(any(target_arch = "x86_64", target_arch = "x86")))]
9
6
  compile_error!("`rdrand` backend can be enabled only for x86 and x86-64 targets!");
10
7
 
@@ -20,8 +17,6 @@ cfg_if! {
20
17
  }
21
18
  }
22
19
 
23
- static RDRAND_GOOD: lazy::LazyBool = lazy::LazyBool::new();
24
-
25
20
  // Recommendation from "Intel® Digital Random Number Generator (DRNG) Software
26
21
  // Implementation Guide" - Section 5.2.1 and "Intel® 64 and IA-32 Architectures
27
22
  // Software Developer’s Manual" - Volume 1 - Section 7.3.17.1.
@@ -72,7 +67,9 @@ fn self_test() -> bool {
72
67
  fails <= 2
73
68
  }
74
69
 
75
- fn is_rdrand_good() -> bool {
70
+ #[cold]
71
+ #[inline(never)]
72
+ fn init() -> bool {
76
73
  #[cfg(not(target_feature = "rdrand"))]
77
74
  {
78
75
  // SAFETY: All Rust x86 targets are new enough to have CPUID, and we
@@ -115,6 +112,15 @@ fn is_rdrand_good() -> bool {
115
112
  unsafe { self_test() }
116
113
  }
117
114
 
115
+ fn is_rdrand_good() -> bool {
116
+ #[path = "../utils/lazy_bool.rs"]
117
+ mod lazy;
118
+
119
+ static RDRAND_GOOD: lazy::LazyBool = lazy::LazyBool::new();
120
+
121
+ RDRAND_GOOD.unsync_init(init)
122
+ }
123
+
118
124
  #[target_feature(enable = "rdrand")]
119
125
  fn rdrand_exact(dest: &mut [MaybeUninit<u8>]) -> Option<()> {
120
126
  // We use chunks_exact_mut instead of chunks_mut as it allows almost all
@@ -162,7 +168,7 @@ fn rdrand_u64() -> Option<u64> {
162
168
 
163
169
  #[inline]
164
170
  pub fn inner_u32() -> Result<u32, Error> {
165
- if !RDRAND_GOOD.unsync_init(is_rdrand_good) {
171
+ if !is_rdrand_good() {
166
172
  return Err(Error::NO_RDRAND);
167
173
  }
168
174
  // SAFETY: After this point, we know rdrand is supported.
@@ -171,7 +177,7 @@ pub fn inner_u32() -> Result<u32, Error> {
171
177
 
172
178
  #[inline]
173
179
  pub fn inner_u64() -> Result<u64, Error> {
174
- if !RDRAND_GOOD.unsync_init(is_rdrand_good) {
180
+ if !is_rdrand_good() {
175
181
  return Err(Error::NO_RDRAND);
176
182
  }
177
183
  // SAFETY: After this point, we know rdrand is supported.
@@ -180,7 +186,7 @@ pub fn inner_u64() -> Result<u64, Error> {
180
186
 
181
187
  #[inline]
182
188
  pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
183
- if !RDRAND_GOOD.unsync_init(is_rdrand_good) {
189
+ if !is_rdrand_good() {
184
190
  return Err(Error::NO_RDRAND);
185
191
  }
186
192
  // SAFETY: After this point, we know rdrand is supported.
@@ -69,8 +69,9 @@ fn is_rndr_available() -> bool {
69
69
 
70
70
  #[cfg(not(target_feature = "rand"))]
71
71
  fn is_rndr_available() -> bool {
72
- #[path = "../utils/lazy.rs"]
72
+ #[path = "../utils/lazy_bool.rs"]
73
73
  mod lazy;
74
+
74
75
  static RNDR_GOOD: lazy::LazyBool = lazy::LazyBool::new();
75
76
 
76
77
  cfg_if::cfg_if! {
@@ -38,9 +38,13 @@ pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
38
38
  .expect("chunk size is bounded by i32::MAX");
39
39
  let p: *mut libc::c_uchar = chunk.as_mut_ptr().cast();
40
40
  let ret = unsafe { libc::randABytes(p, chunk_len) };
41
- if ret != 0 {
42
- let errno = unsafe { libc::errnoGet() };
43
- return Err(Error::from_errno(errno));
41
+ match ret {
42
+ 0 => continue,
43
+ -1 => {
44
+ let errno = unsafe { libc::errnoGet() };
45
+ return Err(Error::from_errno(errno));
46
+ }
47
+ _ => return Err(Error::UNEXPECTED),
44
48
  }
45
49
  }
46
50
  Ok(())