Skip to content

Commit f6b475e

Browse files
Merge pull request #5136 from sensu/go1.26-update
Go1.26 update
2 parents 7881cac + ae95978 commit f6b475e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+372
-2385
lines changed

.appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ branches:
77
- /release\/[0-9.]+/
88

99
image:
10-
- Visual Studio 2015
10+
- Visual Studio 2022
1111
# - Visual Studio 2017
1212

1313
cache:
@@ -16,7 +16,7 @@ cache:
1616
environment:
1717
GOPATH: c:\gopath
1818
GOROOT: c:\Program Files\Go
19-
GOVERSION: 1.24.3
19+
GOVERSION: 1.26.0
2020
GO111MODULE: 'on'
2121
GOPROXY: 'https://proxy.golang.org'
2222

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ orbs:
66
parameters:
77
go_version:
88
type: string
9-
default: "1.24.3"
9+
default: "1.26.0"
1010

1111
sensu_go_build_env: &sensu_go_build_env
1212
docker:

.github/workflows/static-check.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ jobs:
1313
name: staticcheck (project)
1414
runs-on: ubuntu-latest
1515
env:
16-
GO_VERSION: 1.23.4
16+
GO_VERSION: 1.26.0
1717
steps:
1818
- uses: actions/checkout@v4
1919
with:
2020
fetch-depth: 1
21-
- uses: WillAbides/setup-go-faster@v1.14.0
21+
- uses: actions/setup-go@v5
2222
with:
23-
go-version: "1.24.x"
23+
go-version: "1.26.x"
2424
- uses: dominikh/staticcheck-action@v1.3.1
2525
with:
2626
version: "2025.1.1"
2727
install-go: false
28-
cache-key: "1.24.x"
28+
cache-key: "1.26.x"
2929
env:
30-
GO_VERSION: 1.24.3
30+
GO_VERSION: 1.26.0

agent/agent.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"encoding/json"
1111
"errors"
1212
"fmt"
13-
"io/ioutil"
1413
"math/rand"
1514
"net/http"
1615
"net/url"
@@ -273,7 +272,7 @@ func NewAgentContext(ctx context.Context, config *Config) (*Agent, error) {
273272
return nil, fmt.Errorf("error creating agent: %s", err)
274273
}
275274

276-
allowList, err := readAllowList(config.AllowList, ioutil.ReadFile)
275+
allowList, err := readAllowList(config.AllowList, os.ReadFile)
277276
if err != nil {
278277
return nil, err
279278
}

agent/cmd/start.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package cmd
33
import (
44
"context"
55
"fmt"
6-
"io/ioutil"
6+
"io"
77
"os"
88
"path/filepath"
99
"strings"
@@ -476,7 +476,7 @@ func flagSet() *pflag.FlagSet {
476476
flagSet.Duration(flagMaxSessionLength, viper.GetDuration(flagMaxSessionLength), "maximum amount of time after which the agent will reconnect to one of the configured backends (no maximum by default)")
477477
flagSet.Bool(flagStripNetworks, viper.GetBool(flagStripNetworks), "do not include Network info in agent entity state")
478478

479-
flagSet.SetOutput(ioutil.Discard)
479+
flagSet.SetOutput(io.Discard)
480480

481481
return flagSet
482482
}

agent/cmd/start_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ package cmd
22

33
import (
44
"fmt"
5-
"io/ioutil"
65
"os"
76
"reflect"
87
"testing"
98

10-
"github.com/sensu/sensu-go/agent"
119
corev2 "github.com/sensu/core/v2"
10+
"github.com/sensu/sensu-go/agent"
1211
"github.com/spf13/cobra"
1312
"github.com/spf13/viper"
1413
)
@@ -130,7 +129,7 @@ func TestNewAgentConfig_AgentManagedEntityFlag(t *testing.T) {
130129
func tempConfig(t *testing.T, content string) *os.File {
131130
t.Helper()
132131

133-
file, err := ioutil.TempFile(os.TempDir(), "sensu-agent-")
132+
file, err := os.CreateTemp(os.TempDir(), "sensu-agent-")
134133
if err != nil {
135134
t.Fatalf("error creating tmpFile %q: %s", file.Name(), err)
136135
}

agent/debug_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
package agent
55

66
import (
7-
"io/ioutil"
7+
"io"
88

99
"github.com/sirupsen/logrus"
1010
)
1111

1212
func init() {
1313
// Silence logger
14-
logrus.SetOutput(ioutil.Discard)
14+
logrus.SetOutput(io.Discard)
1515
}

asset/boltdb_manager_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"errors"
77
"io"
8-
"io/ioutil"
98
"os"
109
"testing"
1110

@@ -20,7 +19,7 @@ type mockFetcher struct {
2019

2120
func (m *mockFetcher) Fetch(context.Context, string, map[string]string) (*os.File, error) {
2221
if m.pass {
23-
return ioutil.TempFile(os.TempDir(), "boltdb_manager_test_fetcher")
22+
return os.CreateTemp(os.TempDir(), "boltdb_manager_test_fetcher")
2423
}
2524

2625
return nil, errors.New("")
@@ -52,7 +51,7 @@ func (m *mockExpander) Expand(f io.ReadSeeker, path string) error {
5251
func TestGetExistingAsset(t *testing.T) {
5352
t.Parallel()
5453

55-
tmpFile, err := ioutil.TempFile(os.TempDir(), "asset_test_get_existing_asset.db")
54+
tmpFile, err := os.CreateTemp(os.TempDir(), "asset_test_get_existing_asset.db")
5655
if err != nil {
5756
t.Fatalf("unable to create test boltdb file: %v", err)
5857
}
@@ -110,7 +109,7 @@ func TestGetExistingAsset(t *testing.T) {
110109
func TestGetNonexistentAsset(t *testing.T) {
111110
t.Parallel()
112111

113-
tmpFile, err := ioutil.TempFile(os.TempDir(), "asset_test_get_nonexistent_asset.db")
112+
tmpFile, err := os.CreateTemp(os.TempDir(), "asset_test_get_nonexistent_asset.db")
114113
if err != nil {
115114
t.Fatalf("unable to create test boltdb file: %v", err)
116115
}
@@ -147,7 +146,7 @@ func TestGetNonexistentAsset(t *testing.T) {
147146
func TestGetInvalidAsset(t *testing.T) {
148147
t.Parallel()
149148

150-
tmpFile, err := ioutil.TempFile(os.TempDir(), "asset_test_get_invalid_asset.db")
149+
tmpFile, err := os.CreateTemp(os.TempDir(), "asset_test_get_invalid_asset.db")
151150
if err != nil {
152151
t.Fatalf("unable to create test boltdb file: %v", err)
153152
}
@@ -185,7 +184,7 @@ func TestGetInvalidAsset(t *testing.T) {
185184
func TestFailedExpand(t *testing.T) {
186185
t.Parallel()
187186

188-
tmpFile, err := ioutil.TempFile(os.TempDir(), "asset_test_get_invalid_asset.db")
187+
tmpFile, err := os.CreateTemp(os.TempDir(), "asset_test_get_invalid_asset.db")
189188
if err != nil {
190189
t.Fatalf("unable to create test boltdb file: %v", err)
191190
}
@@ -224,7 +223,7 @@ func TestFailedExpand(t *testing.T) {
224223
func TestSuccessfulGetAsset(t *testing.T) {
225224
t.Parallel()
226225

227-
tmpFile, err := ioutil.TempFile(os.TempDir(), "asset_test_get_invalid_asset.db")
226+
tmpFile, err := os.CreateTemp(os.TempDir(), "asset_test_get_invalid_asset.db")
228227
if err != nil {
229228
t.Fatalf("unable to create test boltdb file: %v", err)
230229
}

asset/expander.go

Lines changed: 88 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package asset
22

33
import (
4+
"archive/tar"
5+
"compress/gzip"
46
"errors"
57
"fmt"
68
"io"
7-
8-
archiver "github.com/mholt/archiver/v3"
9+
"os"
10+
"path/filepath"
11+
"strings"
912

1013
filetype "gopkg.in/h2non/filetype.v1"
1114
filetype_types "gopkg.in/h2non/filetype.v1/types"
@@ -45,32 +48,105 @@ func (a *archiveExpander) Expand(archive io.ReadSeeker, targetDirectory string)
4548
return err
4649
}
4750

48-
var ar archiver.Unarchiver
51+
namer, ok := archive.(namer)
52+
if !ok {
53+
return errors.New("couldn't get path to archive")
54+
}
4955

5056
// If the file is not an archive, exit with an error.
5157
switch ft.MIME.Value {
5258
case "application/x-tar":
53-
ar = archiver.NewTar()
59+
if err := extractTar(namer.Name(), targetDirectory); err != nil {
60+
return fmt.Errorf("error extracting asset: %s", err)
61+
}
5462
case "application/gzip":
55-
ar = archiver.NewTarGz()
56-
63+
if err := extractTarGz(namer.Name(), targetDirectory); err != nil {
64+
return fmt.Errorf("error extracting asset: %s", err)
65+
}
5766
default:
5867
return fmt.Errorf(
5968
"given file of format '%s' does not appear valid",
6069
ft.MIME.Value,
6170
)
6271
}
6372

64-
namer, ok := archive.(namer)
65-
if !ok {
66-
return errors.New("couldn't get path to archive")
73+
return nil
74+
}
75+
76+
// extractTar extracts a tar archive at srcPath into destDir.
77+
func extractTar(srcPath, destDir string) error {
78+
f, err := os.Open(srcPath)
79+
if err != nil {
80+
return err
81+
}
82+
defer f.Close()
83+
return untar(f, destDir)
84+
}
85+
86+
// extractTarGz extracts a gzip-compressed tar archive at srcPath into destDir.
87+
func extractTarGz(srcPath, destDir string) error {
88+
f, err := os.Open(srcPath)
89+
if err != nil {
90+
return err
6791
}
92+
defer f.Close()
6893

69-
// Extract the archive to the desired path
70-
if err := ar.Unarchive(namer.Name(), targetDirectory); err != nil {
71-
return fmt.Errorf("error extracting asset: %s", err)
94+
gr, err := gzip.NewReader(f)
95+
if err != nil {
96+
return err
7297
}
98+
defer gr.Close()
7399

100+
return untar(gr, destDir)
101+
}
102+
103+
// untar reads a tar stream and extracts files into destDir.
104+
func untar(r io.Reader, destDir string) error {
105+
tr := tar.NewReader(r)
106+
for {
107+
hdr, err := tr.Next()
108+
if err == io.EOF {
109+
break
110+
}
111+
if err != nil {
112+
return err
113+
}
114+
115+
// Sanitize the name to prevent path traversal.
116+
cleanName := filepath.Clean(hdr.Name)
117+
if strings.HasPrefix(cleanName, "..") {
118+
return fmt.Errorf("invalid file path in archive: %s", hdr.Name)
119+
}
120+
121+
target := filepath.Join(destDir, cleanName)
122+
123+
switch hdr.Typeflag {
124+
case tar.TypeDir:
125+
if err := os.MkdirAll(target, os.FileMode(hdr.Mode)); err != nil {
126+
return err
127+
}
128+
case tar.TypeReg:
129+
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
130+
return err
131+
}
132+
outFile, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(hdr.Mode))
133+
if err != nil {
134+
return err
135+
}
136+
if _, err := io.Copy(outFile, tr); err != nil {
137+
outFile.Close()
138+
return err
139+
}
140+
outFile.Close()
141+
case tar.TypeSymlink:
142+
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
143+
return err
144+
}
145+
if err := os.Symlink(hdr.Linkname, target); err != nil {
146+
return err
147+
}
148+
}
149+
}
74150
return nil
75151
}
76152

asset/fetcher.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"crypto/x509"
88
"fmt"
99
"io"
10-
"io/ioutil"
1110
"net/http"
1211
"os"
1312
"strings"
@@ -47,7 +46,7 @@ func httpGet(ctx context.Context, path, trustedCAFile string, headers map[string
4746
rootCAs = x509.NewCertPool()
4847
}
4948

50-
certs, err := ioutil.ReadFile(trustedCAFile)
49+
certs, err := os.ReadFile(trustedCAFile)
5150
if err != nil {
5251
logger.WithError(err).Errorf("failed to read trusted CA file: %s", trustedCAFile)
5352
}

0 commit comments

Comments
 (0)