A shepherd for your Appimages.
0

Configure Feed

Select the types of activity you want to include in your feed.

source/zsync: avoid OOMs from bad people

Aly Raffauf (Jun 19, 2026, 3:37 AM EDT) ffccce28 7d59fc13

+4 -2
+3 -1
internal/appherder/source.go
··· 193 193 return matches[0], nil 194 194 } 195 195 196 + const apiResponseLimit = 4 * 1024 * 1024 // 4 MiB; real API responses are a few KB 197 + 196 198 // decodeJSON decodes a JSON value from r, wrapping any error with desc. 197 199 func decodeJSON[T any](r io.Reader, desc string) (T, error) { 198 200 var value T 199 - if err := json.NewDecoder(r).Decode(&value); err != nil { 201 + if err := json.NewDecoder(io.LimitReader(r, apiResponseLimit)).Decode(&value); err != nil { 200 202 return value, fmt.Errorf("%s: %w", desc, err) 201 203 } 202 204 return value, nil
+1 -1
internal/appherder/source_zsync.go
··· 55 55 } 56 56 defer resp.Body.Close() 57 57 58 - header, err := parseZsyncHeader(resp.Body) 58 + header, err := parseZsyncHeader(io.LimitReader(resp.Body, apiResponseLimit)) 59 59 if err != nil { 60 60 return nil, fmt.Errorf("parse zsync control file %s: %w", zsyncURL, err) 61 61 }