Commit cca1aac
committed
Fix 64-bit file offsets on Windows
On Windows, C `off_t` is `long`, i.e. 32-bit, so it cannot represent file
offsets or sizes at or beyond 2 GiB. The offset typealias `_COffT` was
unconditionally `off_t`, so `FileDescriptor.seek`, `read`/`write` at an
absolute offset, and `resize` funneled a public `Int64` through a 32-bit
conversion. Because Swift's numeric conversions are range-checked, any
offset >= 2^31 trapped at runtime, and positioned I/O could never target a
region past 4 GiB (the `OVERLAPPED` high dword was always zero).
Make `_COffT` 64-bit on Windows and thread it through `system_lseek`,
`system_pread`, `system_pwrite`, and `system_ftruncate` (unchanged on other
platforms, where `_COffT` remains `off_t`). The Windows adapters already had
a 64-bit `lseek` overload backed by `_lseeki64`; the now-redundant 32-bit
`_lseek` overload is removed so overload resolution selects it. The
`OVERLAPPED` offset split now uses truncating conversions, since
`DWORD(UInt32(offset))` would itself trap once offsets exceed 4 GiB.1 parent 03604ff commit cca1aac
4 files changed
Lines changed: 77 additions & 19 deletions
File tree
- Sources/System/Internals
- Tests/SystemTests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
35 | 43 | | |
| 44 | + | |
36 | 45 | | |
37 | 46 | | |
38 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | | - | |
94 | | - | |
| 93 | + | |
| 94 | + | |
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
121 | 121 | | |
122 | 122 | | |
123 | 123 | | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | 124 | | |
132 | 125 | | |
133 | 126 | | |
| |||
144 | 137 | | |
145 | 138 | | |
146 | 139 | | |
147 | | - | |
| 140 | + | |
148 | 141 | | |
149 | 142 | | |
150 | 143 | | |
| |||
159 | 152 | | |
160 | 153 | | |
161 | 154 | | |
162 | | - | |
163 | | - | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
164 | 159 | | |
165 | 160 | | |
166 | 161 | | |
| |||
172 | 167 | | |
173 | 168 | | |
174 | 169 | | |
175 | | - | |
| 170 | + | |
176 | 171 | | |
177 | 172 | | |
178 | 173 | | |
| |||
187 | 182 | | |
188 | 183 | | |
189 | 184 | | |
190 | | - | |
191 | | - | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
192 | 189 | | |
193 | 190 | | |
194 | 191 | | |
| |||
214 | 211 | | |
215 | 212 | | |
216 | 213 | | |
217 | | - | |
| 214 | + | |
218 | 215 | | |
219 | 216 | | |
220 | 217 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
328 | 328 | | |
329 | 329 | | |
330 | 330 | | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
331 | 383 | | |
332 | 384 | | |
333 | 385 | | |
0 commit comments