From f6855314eae6e8ea655d58607986020c4da9019e Mon Sep 17 00:00:00 2001 From: Meo597 <197331664+Meo597@users.noreply.github.com> Date: Mon, 26 Oct 2026 08:56:18 +0800 Subject: [PATCH] limit the file size for downloads --- app/geodata/download.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/geodata/download.go b/app/geodata/download.go index 11218e7fa..8d9789f7a 100644 --- a/app/geodata/download.go +++ b/app/geodata/download.go @@ -22,6 +22,7 @@ import ( ) const idleTimeout = 30 * time.Second +const maxDownloadSize int64 = 256 * 1024 * 1024 // DO NOT EDIT. Ignored by geodata, rejected by Lua. const luaGuardHeader = "\x12\x01\x00" @@ -216,14 +217,19 @@ func (d *downloader) fetch(rawURL string, writer io.Writer) error { defer resp.Body.Close() if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { - io.Copy(io.Discard, resp.Body) return errors.New("unexpected status code: ", resp.StatusCode) } + if resp.ContentLength > maxDownloadSize { + return errors.New("geodata download exceeds 256 MiB") + } - n, err := io.Copy(writer, resp.Body) + n, err := io.Copy(writer, io.LimitReader(resp.Body, maxDownloadSize+1)) if err != nil { return err } + if n > maxDownloadSize { + return errors.New("geodata download exceeds 256 MiB") + } if n == 0 { return errors.New("empty response body") }