# HG changeset patch # User Kim Alvefur # Date 1621253665 -7200 # Node ID d5360307a99dfbae5621af71ec5840819d2840bd # Parent c471e19a238e356db17f2b0c4cac80163708ee6f mod_http_file_share: Handle out of bounds Range request Turns out you can seek past the end of the file without getting an error. Also rejects empty range instead of sending the whole file. diff -r c471e19a238e -r d5360307a99d plugins/mod_http_file_share.lua --- a/plugins/mod_http_file_share.lua Sun May 16 19:05:20 2021 +0200 +++ b/plugins/mod_http_file_share.lua Mon May 17 14:14:25 2021 +0200 @@ -361,10 +361,15 @@ if request_range then local range_start, range_end = request_range:match("^bytes=(%d+)%-(%d*)$") -- Only support resumption, ie ranges from somewhere in the middle until the end of the file. - if (range_start and range_start ~= "0" and range_start ~= filesize) and (range_end == "" or range_end == filesize) then - if handle:seek("set", tonumber(range_start)) then + if (range_start and range_start ~= "0") and (range_end == "" or range_end == filesize) then + local pos, size = tonumber(range_start), tonumber(filesize); + local new_pos = pos < size and handle:seek("set", pos); + if new_pos and new_pos < size then response_range = "bytes "..range_start.."-"..filesize.."/"..filesize; - filesize = string.format("%d", tonumber(filesize)-tonumber(range_start)); + filesize = string.format("%d", size-pos); + else + handle:close(); + return 416; end end end