diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | lib/dsv/metadata_test.go | 49 | ||||
| -rw-r--r-- | lib/dsv/writer.go | 1 | ||||
| -rw-r--r-- | lib/email/body.go | 2 | ||||
| -rw-r--r-- | lib/ini/reader.go | 6 | ||||
| -rw-r--r-- | lib/math/big/rat_example_test.go | 4 | ||||
| -rw-r--r-- | lib/memfs/memfs_test.go | 13 | ||||
| -rw-r--r-- | lib/memfs/node.go | 7 | ||||
| -rw-r--r-- | lib/os/extract.go | 46 | ||||
| -rw-r--r-- | lib/smtp/server.go | 10 | ||||
| -rw-r--r-- | lib/websocket/request.go | 2 |
11 files changed, 83 insertions, 61 deletions
@@ -31,15 +31,11 @@ test.prof: go test -race -timeout=1m -cpuprofile $(CPU_PROF) -memprofile $(MEM_PROF) ./... lint: - -go vet ./... -fieldalignment ./... -shadow ./... -golangci-lint run \ --presets bugs,metalinter,performance,unused \ --disable exhaustive \ - --disable gosec \ - --disable ineffassign \ - --disable makezero \ --disable musttag \ ./... diff --git a/lib/dsv/metadata_test.go b/lib/dsv/metadata_test.go index 373bfddd..0d602adb 100644 --- a/lib/dsv/metadata_test.go +++ b/lib/dsv/metadata_test.go @@ -9,39 +9,38 @@ import ( ) func TestMetadataIsEqual(t *testing.T) { - cases := []struct { + type testCase struct { in Metadata out Metadata result bool - }{ - { - Metadata{ - Name: "A", - Separator: ",", - }, - Metadata{ - Name: "A", - Separator: ",", - }, - true, + } + var listCase = []testCase{{ + Metadata{ + Name: `A`, + Separator: `,`, }, - { - Metadata{ - Name: "A", - Separator: ",", - }, - Metadata{ - Name: "A", - Separator: ";", - }, - false, + Metadata{ + Name: `A`, + Separator: `,`, }, - } + true, + }, { + Metadata{ + Name: `A`, + Separator: `,`, + }, + Metadata{ + Name: `A`, + Separator: `;`, + }, + false, + }} - for _, c := range cases { + var c testCase + for _, c = range listCase { var got = c.in.IsEqual(&c.out) if got != c.result { - t.Error("Test failed on ", c.in, c.out) + t.Error(`Test failed on `, c.in, c.out) } } } diff --git a/lib/dsv/writer.go b/lib/dsv/writer.go index 1293a6c8..65c9298c 100644 --- a/lib/dsv/writer.go +++ b/lib/dsv/writer.go @@ -470,7 +470,6 @@ func (writer *Writer) Write(reader ReaderInterface) (int, error) { // String yes, it will print it in JSON like format. func (writer *Writer) String() string { r, e := json.MarshalIndent(writer, "", "\t") - if nil != e { log.Print(e) } diff --git a/lib/email/body.go b/lib/email/body.go index 07970fae..91ebcb04 100644 --- a/lib/email/body.go +++ b/lib/email/body.go @@ -241,7 +241,7 @@ func (body *Body) Simple() (out []byte) { case 1: default: if out[x-1] != cr && out[x] != lf { - out = append(out, "\r\n"...) + out = append(out, "\r\n"...) //nolint:makezero } } diff --git a/lib/ini/reader.go b/lib/ini/reader.go index 35d31bef..9e7b1ad7 100644 --- a/lib/ini/reader.go +++ b/lib/ini/reader.go @@ -351,7 +351,6 @@ func (reader *reader) parseVariable() (err error) { if err != nil { // The only possible error here is [io.EOF], so we // end it. - err = nil break } switch { @@ -395,7 +394,7 @@ func (reader *reader) parseVariable() (err error) { reader._var.format = reader.bufFormat.String() reader._var.key = reader.buf.String() - return nil + return nil //nolint:nilerr } // parsePossibleValue will check if the next character after space is comment @@ -407,7 +406,6 @@ func (reader *reader) parsePossibleValue() (err error) { if err != nil { // The only possible error here is [io.EOF], so we // end it. - err = nil break } switch reader.b { @@ -432,7 +430,7 @@ func (reader *reader) parsePossibleValue() (err error) { reader._var.mode = lineModeKeyOnly reader._var.format = reader.bufFormat.String() - return nil + return nil //nolint:nilerr } // At this point we found `=` on source, and we expect the rest of source will diff --git a/lib/math/big/rat_example_test.go b/lib/math/big/rat_example_test.go index c78f132b..d1669765 100644 --- a/lib/math/big/rat_example_test.go +++ b/lib/math/big/rat_example_test.go @@ -414,7 +414,7 @@ func ExampleRat_MarshalJSON() { func ExampleRat_MarshalJSON_withStruct() { type T struct { - V *Rat + V *Rat `json:"V"` } inputs := []T{ @@ -430,7 +430,7 @@ func ExampleRat_MarshalJSON_withStruct() { ) MarshalJSONAsString = true for _, in = range inputs { - out, err = json.Marshal(in) + out, err = json.Marshal(&in) if err != nil { log.Fatal(err) } diff --git a/lib/memfs/memfs_test.go b/lib/memfs/memfs_test.go index e6dffb0a..3c0f3f5e 100644 --- a/lib/memfs/memfs_test.go +++ b/lib/memfs/memfs_test.go @@ -58,14 +58,16 @@ func TestMain(m *testing.M) { } func TestNew(t *testing.T) { - afile := filepath.Join(_testWD, "testdata/index.html") - - cases := []struct { + type testCase struct { desc string expErr string expMapKeys []string opts Options - }{{ + } + + var afile = filepath.Join(_testWD, `testdata/index.html`) + + var listCase = []testCase{{ desc: "With empty dir", expErr: "open : no such file or directory", }, { @@ -152,10 +154,11 @@ func TestNew(t *testing.T) { }} var ( + c testCase mfs *MemFS err error ) - for _, c := range cases { + for _, c = range listCase { t.Log(c.desc) mfs, err = New(&c.opts) diff --git a/lib/memfs/node.go b/lib/memfs/node.go index 34ed18a5..5ed87b02 100644 --- a/lib/memfs/node.go +++ b/lib/memfs/node.go @@ -262,9 +262,10 @@ func (node *Node) Readdir(count int) (fis []os.FileInfo, err error) { return nil, nil } if count <= 0 || count >= len(node.Childs) { - fis = make([]os.FileInfo, len(node.Childs)) - for x := 0; x < len(node.Childs); x++ { - fis[x] = node.Childs[x] + fis = make([]os.FileInfo, 0, len(node.Childs)) + var child *Node + for _, child = range node.Childs { + fis = append(fis, child) } node.off = 0 return fis, nil diff --git a/lib/os/extract.go b/lib/os/extract.go index 1d7841f5..3125429f 100644 --- a/lib/os/extract.go +++ b/lib/os/extract.go @@ -231,10 +231,15 @@ func (xtrk *extractor) bunzip2(fin *os.File) (fout *os.File, err error) { bz2Reader = bzip2.NewReader(bufio.NewReader(fin)) - _, err = io.Copy(fout, bz2Reader) - if err != nil { - _ = fout.Close() - return nil, fmt.Errorf("%s: %w", logp, err) + for { + _, err = io.CopyN(fout, bz2Reader, 1024) + if err != nil { + if errors.Is(err, io.EOF) { + break + } + _ = fout.Close() + return nil, fmt.Errorf(`%s: %w`, logp, err) + } } // Reset the file output descriptor to the beginning. @@ -273,11 +278,16 @@ func (xtrk *extractor) gunzip(fin *os.File) (fout *os.File, err error) { return nil, fmt.Errorf("%s: %w", logp, err) } - _, err = io.Copy(fout, gzReader) - if err != nil { - _ = fout.Close() - _ = gzReader.Close() - return nil, fmt.Errorf("%s: %w", logp, err) + for { + _, err = io.CopyN(fout, gzReader, 1024) + if err != nil { + if errors.Is(err, io.EOF) { + break + } + _ = fout.Close() + _ = gzReader.Close() + return nil, fmt.Errorf(`%s: %w`, logp, err) + } } err = gzReader.Close() @@ -319,13 +329,20 @@ func (xtrk *extractor) untar(fin io.Reader) (err error) { return fmt.Errorf("%s: %w", logp, err) } - fi = hdr.FileInfo() + // gosec detect the following line as G305 or [CWE-22]. + // We handle it by detecting the joined path, if its not + // under the dirOutput, then we return it as error. + // + // [CWE-22]: https://cwe.mitre.org/data/definitions/22.html + // + //nolint:gosec filePath = filepath.Join(xtrk.dirOutput, hdr.Name) if !strings.HasPrefix(filePath, xtrk.dirOutput) { return fmt.Errorf(`%s: extract path outside of output directory`, logp) } + fi = hdr.FileInfo() if fi.IsDir() { err = os.Mkdir(filePath, fi.Mode()) if err != nil { @@ -399,13 +416,20 @@ func (xtrk *extractor) unzip(fin *os.File) (err error) { return fmt.Errorf("%s: %w", logp, err) } - fi = zipFile.FileInfo() + // gosec detect the following line as G305 or [CWE-22]. + // We handle it by detecting the joined path, if its not + // under the dirOutput, then we return it as error. + // + // [CWE-22]: https://cwe.mitre.org/data/definitions/22.html + // + //nolint:gosec filePath = filepath.Join(xtrk.dirOutput, zipFile.Name) if !strings.HasPrefix(filePath, xtrk.dirOutput) { return fmt.Errorf(`%s: extract path outside of output directory`, logp) } + fi = zipFile.FileInfo() if fi.IsDir() { err = os.Mkdir(filePath, fi.Mode()) if err != nil { diff --git a/lib/smtp/server.go b/lib/smtp/server.go index 78e657c0..42a76352 100644 --- a/lib/smtp/server.go +++ b/lib/smtp/server.go @@ -412,10 +412,12 @@ func (srv *Server) handleDATA(recv *receiver) (err error) { func (srv *Server) handleEHLO(recv *receiver, cmd *Command) (err error) { recv.clientDomain = cmd.Arg - body := make([]string, len(srv.Exts)) - for x, ext := range srv.Exts { - body[x] = ext.Name() - body[x] += " " + ext.Params() + var ( + body = make([]string, 0, len(srv.Exts)) + ext Extension + ) + for _, ext = range srv.Exts { + body = append(body, ext.Name()+` `+ext.Params()) } if !recv.isAuthenticated() { diff --git a/lib/websocket/request.go b/lib/websocket/request.go index d56d6406..60a44349 100644 --- a/lib/websocket/request.go +++ b/lib/websocket/request.go @@ -59,7 +59,7 @@ type Request struct { ID uint64 `json:"id"` // Conn is the client connection, where the request come from. - Conn int + Conn int `json:"-"` } // reset all Request field's value to zero. |
