From b1773ee5e9ebd8c8be72f315981268992c08b3f1 Mon Sep 17 00:00:00 2001 From: Li4n0 <34324462+Li4n0@users.noreply.github.com> Date: Fri, 25 Jun 2021 21:15:47 +0800 Subject: [PATCH] fix(ipinfo): fix a potential panic when downloading ip location database (#33) --- internal/ipinfo/geoip/download.go | 17 ++++++++++++++--- internal/ipinfo/qqwry/download.go | 23 +++++++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/internal/ipinfo/geoip/download.go b/internal/ipinfo/geoip/download.go index acb13ae..6af3390 100644 --- a/internal/ipinfo/geoip/download.go +++ b/internal/ipinfo/geoip/download.go @@ -20,6 +20,7 @@ const ( ) func get(url string) (b []byte, err error) { + var resp *http.Response client := http.Client{ Timeout: 90 * time.Second, Transport: &http.Transport{ @@ -28,11 +29,17 @@ func get(url string) (b []byte, err error) { request, _ := http.NewRequest(http.MethodGet, url, nil) request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36") - resp, err := client.Do(request) + resp, err = client.Do(request) if err != nil { return } - defer resp.Body.Close() + + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Warn("%v", err) + } + }(resp.Body) return io.ReadAll(resp.Body) } @@ -65,10 +72,14 @@ func extractTarGz(gzipStream io.Reader) error { if err != nil { return err } - defer outFile.Close() if _, err := io.Copy(outFile, tarReader); err != nil { + _ = outFile.Close() return err } + err = outFile.Close() + if err != nil { + log.Warn("%v", err) + } } } return nil diff --git a/internal/ipinfo/qqwry/download.go b/internal/ipinfo/qqwry/download.go index 072a1d6..a22baa5 100644 --- a/internal/ipinfo/qqwry/download.go +++ b/internal/ipinfo/qqwry/download.go @@ -21,6 +21,7 @@ const ( ) func get(url string) (b []byte, err error) { + var resp *http.Response client := http.Client{ Timeout: 90 * time.Second, Transport: &http.Transport{ @@ -29,11 +30,17 @@ func get(url string) (b []byte, err error) { request, _ := http.NewRequest("GET", url, nil) request.Header.Add("User-Agent", "Nali/2.1.2 (Nali CLI, https://nali.skk.moe)") - resp, err := client.Do(request) + resp, err = client.Do(request) if err != nil { return } - defer resp.Body.Close() + + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Warn("%v", err) + } + }(resp.Body) return io.ReadAll(resp.Body) } @@ -47,17 +54,25 @@ func getKey(b []byte) (key uint32, err error) { } func decrypt(b []byte, key uint32) (_ []byte, err error) { + var rc io.ReadCloser for i := 0; i < 0x200; i++ { key *= uint32(0x805) key++ key &= uint32(0xff) b[i] = b[i] ^ byte(key) } - rc, err := zlib.NewReader(bytes.NewBuffer(b)) + rc, err = zlib.NewReader(bytes.NewBuffer(b)) if err != nil { return } - defer rc.Close() + + defer func(rc io.ReadCloser) { + err := rc.Close() + if err != nil { + log.Warn("%v", err) + } + }(rc) + return io.ReadAll(rc) }