@@ -208,18 +208,43 @@ function mmap(io::IO,
208
208
mmaplen = (offset - offset_page) + len
209
209
210
210
file_desc = gethandle (io)
211
+ szfile = convert (Csize_t, len + offset)
212
+ requestedSizeLarger = false
213
+ if ! (io isa Mmap. Anonymous)
214
+ @static if ! Sys. isapple ()
215
+ requestedSizeLarger = szfile > filesize (io)
216
+ end
217
+ end
211
218
# platform-specific mmapping
212
219
@static if Sys. isunix ()
213
220
prot, flags, iswrite = settings (file_desc, shared)
214
- iswrite && grow && grow! (io, offset, len)
221
+ if requestedSizeLarger
222
+ if iswrite
223
+ if grow
224
+ grow! (io, offset, len)
225
+ else
226
+ throw (ArgumentError (" requested size $szfile larger than file size $(filesize (io)) , but requested not to grow" ))
227
+ end
228
+ else
229
+ throw (ArgumentError (" unable to increase file size to $szfile due to read-only permissions" ))
230
+ end
231
+ end
232
+ @static if Sys. isapple ()
233
+ iswrite && grow && grow! (io, offset, len)
234
+ end
215
235
# mmap the file
216
236
ptr = ccall (:jl_mmap , Ptr{Cvoid}, (Ptr{Cvoid}, Csize_t, Cint, Cint, RawFD, Int64),
217
237
C_NULL , mmaplen, prot, flags, file_desc, offset_page)
218
238
systemerror (" memory mapping failed" , reinterpret (Int, ptr) == - 1 )
219
239
else
220
240
name, readonly, create = settings (io)
221
- szfile = convert (Csize_t, len + offset)
222
- readonly && szfile > filesize (io) && throw (ArgumentError (" unable to increase file size to $szfile due to read-only permissions" ))
241
+ if requestedSizeLarger
242
+ if readonly
243
+ throw (ArgumentError (" unable to increase file size to $szfile due to read-only permissions" ))
244
+ elseif ! grow
245
+ throw (ArgumentError (" requested size $szfile larger than file size $(filesize (io)) , but requested not to grow" ))
246
+ end
247
+ end
223
248
handle = create ? ccall (:CreateFileMappingW , stdcall, Ptr{Cvoid}, (OS_HANDLE, Ptr{Cvoid}, DWORD, DWORD, DWORD, Cwstring),
224
249
file_desc, C_NULL , readonly ? PAGE_READONLY : PAGE_READWRITE, szfile >> 32 , szfile & typemax (UInt32), name) :
225
250
ccall (:OpenFileMappingW , stdcall, Ptr{Cvoid}, (DWORD, Cint, Cwstring),
0 commit comments