Skip to content

Commit d6881ec

Browse files
committed
fix: pass receiver to HookContextImpl literal
1 parent e0f8bfe commit d6881ec

File tree

3 files changed

+126
-100
lines changed

3 files changed

+126
-100
lines changed

tool/instrument/optimize.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func newCallContextImpl(tjump *TJump) dst.Expr {
136136

137137
// Build params slice: []interface{}{&param1, &param2, ...}
138138
// Use createHookArgs to handle underscore parameters correctly
139-
paramNames := getNames(targetFunc.Type.Params)
139+
paramNames := collectArguments(targetFunc)
140140
paramExprs := createHookArgs(paramNames)
141141
paramsSlice := ast.CompositeLit(
142142
ast.ArrayType(ast.InterfaceType()),
@@ -146,7 +146,7 @@ func newCallContextImpl(tjump *TJump) dst.Expr {
146146
// Build returnVals slice: []interface{}{&retval1, &retval2, ...}
147147
returnExprs := make([]dst.Expr, 0)
148148
if targetFunc.Type.Results != nil {
149-
returnNames := getNames(targetFunc.Type.Results)
149+
returnNames := collectReturnValues(targetFunc)
150150
returnExprs = createHookArgs(returnNames)
151151
}
152152
returnValsSlice := ast.CompositeLit(

tool/preprocess/extract.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Copyright (c) 2025 Alibaba Group Holding Ltd.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package preprocess
16+
17+
import (
18+
"archive/tar"
19+
"compress/gzip"
20+
"io"
21+
"os"
22+
"path/filepath"
23+
"strings"
24+
25+
"github.com/alibaba/loongsuite-go-agent/tool/ex"
26+
)
27+
28+
const (
29+
unzippedPkgDir = "pkg"
30+
)
31+
32+
func extractGZip(data []byte, targetDir string) error {
33+
err := os.MkdirAll(targetDir, 0755)
34+
if err != nil {
35+
return ex.Wrap(err)
36+
}
37+
38+
gzReader, err := gzip.NewReader(strings.NewReader(string(data)))
39+
if err != nil {
40+
return ex.Wrap(err)
41+
}
42+
defer func() {
43+
err := gzReader.Close()
44+
if err != nil {
45+
ex.Fatal(err)
46+
}
47+
}()
48+
49+
tarReader := tar.NewReader(gzReader)
50+
for {
51+
header, err := tarReader.Next()
52+
if err == io.EOF {
53+
break
54+
}
55+
if err != nil {
56+
return ex.Wrap(err)
57+
}
58+
59+
// Skip AppleDouble files (._filename) and other hidden files
60+
if strings.HasPrefix(filepath.Base(header.Name), "._") ||
61+
strings.HasPrefix(filepath.Base(header.Name), ".") {
62+
continue
63+
}
64+
65+
// Rename pkg_tmp to pkg in the path
66+
// Normalize path to Unix style for consistent string operations
67+
cleanName := filepath.ToSlash(filepath.Clean(header.Name))
68+
if strings.HasPrefix(cleanName, "pkg_tmp/") {
69+
cleanName = strings.Replace(cleanName, "pkg_tmp/", "pkg/", 1)
70+
} else if cleanName == "pkg_tmp" {
71+
cleanName = unzippedPkgDir
72+
}
73+
74+
// Sanitize the file path to prevent Zip Slip vulnerability
75+
if cleanName == "." || cleanName == ".." ||
76+
strings.HasPrefix(cleanName, "..") {
77+
continue
78+
}
79+
80+
// Ensure the resolved path is within the target directory
81+
targetPath := filepath.Join(targetDir, cleanName)
82+
resolvedPath, err := filepath.EvalSymlinks(targetPath)
83+
if err != nil {
84+
// If symlink evaluation fails, use the original path
85+
resolvedPath = targetPath
86+
}
87+
88+
// Check if the resolved path is within the target directory
89+
relPath, err := filepath.Rel(targetDir, resolvedPath)
90+
if err != nil || strings.HasPrefix(relPath, "..") ||
91+
filepath.IsAbs(relPath) {
92+
continue // Skip files that would be extracted outside target dir
93+
}
94+
switch header.Typeflag {
95+
case tar.TypeDir:
96+
err = os.MkdirAll(targetPath, os.FileMode(header.Mode))
97+
if err != nil {
98+
return ex.Wrap(err)
99+
}
100+
101+
case tar.TypeReg:
102+
file, err := os.OpenFile(targetPath, os.O_CREATE|os.O_RDWR,
103+
os.FileMode(header.Mode))
104+
if err != nil {
105+
return ex.Wrap(err)
106+
}
107+
108+
_, err = io.Copy(file, tarReader)
109+
if err != nil {
110+
return ex.Wrap(err)
111+
}
112+
err = file.Close()
113+
if err != nil {
114+
return ex.Wrap(err)
115+
}
116+
117+
default:
118+
return ex.Newf("unsupported file type: %c in %s",
119+
header.Typeflag, header.Name)
120+
}
121+
}
122+
123+
return nil
124+
}

tool/preprocess/update.go

Lines changed: 0 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,8 @@
1515
package preprocess
1616

1717
import (
18-
"archive/tar"
19-
"compress/gzip"
20-
"io"
2118
"os"
2219
"path/filepath"
23-
"strings"
2420

2521
"github.com/alibaba/loongsuite-go-agent/tool/config"
2622
"github.com/alibaba/loongsuite-go-agent/tool/data"
@@ -77,100 +73,6 @@ func writeGoMod(gomod string, modfile *modfile.File) error {
7773
return nil
7874
}
7975

80-
func extractGZip(data []byte, targetDir string) error {
81-
err := os.MkdirAll(targetDir, 0755)
82-
if err != nil {
83-
return ex.Wrap(err)
84-
}
85-
86-
gzReader, err := gzip.NewReader(strings.NewReader(string(data)))
87-
if err != nil {
88-
return ex.Wrap(err)
89-
}
90-
defer func() {
91-
err := gzReader.Close()
92-
if err != nil {
93-
ex.Fatal(err)
94-
}
95-
}()
96-
97-
tarReader := tar.NewReader(gzReader)
98-
for {
99-
header, err := tarReader.Next()
100-
if err == io.EOF {
101-
break
102-
}
103-
if err != nil {
104-
return ex.Wrap(err)
105-
}
106-
107-
// Skip AppleDouble files (._filename) and other hidden files
108-
if strings.HasPrefix(filepath.Base(header.Name), "._") ||
109-
strings.HasPrefix(filepath.Base(header.Name), ".") {
110-
continue
111-
}
112-
113-
// Rename pkg_tmp to pkg in the path
114-
// Normalize path to Unix style for consistent string operations
115-
cleanName := filepath.ToSlash(filepath.Clean(header.Name))
116-
if strings.HasPrefix(cleanName, "pkg_tmp/") {
117-
cleanName = strings.Replace(cleanName, "pkg_tmp/", "pkg/", 1)
118-
} else if cleanName == "pkg_tmp" {
119-
cleanName = "pkg"
120-
}
121-
122-
// Sanitize the file path to prevent Zip Slip vulnerability
123-
if cleanName == "." || cleanName == ".." ||
124-
strings.HasPrefix(cleanName, "..") {
125-
continue
126-
}
127-
128-
// Ensure the resolved path is within the target directory
129-
targetPath := filepath.Join(targetDir, cleanName)
130-
resolvedPath, err := filepath.EvalSymlinks(targetPath)
131-
if err != nil {
132-
// If symlink evaluation fails, use the original path
133-
resolvedPath = targetPath
134-
}
135-
136-
// Check if the resolved path is within the target directory
137-
relPath, err := filepath.Rel(targetDir, resolvedPath)
138-
if err != nil || strings.HasPrefix(relPath, "..") ||
139-
filepath.IsAbs(relPath) {
140-
continue // Skip files that would be extracted outside target dir
141-
}
142-
switch header.Typeflag {
143-
case tar.TypeDir:
144-
err = os.MkdirAll(targetPath, os.FileMode(header.Mode))
145-
if err != nil {
146-
return ex.Wrap(err)
147-
}
148-
149-
case tar.TypeReg:
150-
file, err := os.OpenFile(targetPath, os.O_CREATE|os.O_RDWR,
151-
os.FileMode(header.Mode))
152-
if err != nil {
153-
return ex.Wrap(err)
154-
}
155-
156-
_, err = io.Copy(file, tarReader)
157-
if err != nil {
158-
return ex.Wrap(err)
159-
}
160-
err = file.Close()
161-
if err != nil {
162-
return ex.Wrap(err)
163-
}
164-
165-
default:
166-
return ex.Newf("unsupported file type: %c in %s",
167-
header.Typeflag, header.Name)
168-
}
169-
}
170-
171-
return nil
172-
}
173-
17476
// Fetch the zipped pkg module from the embedded data section and extract it to
17577
// a temporary directory, then return the path to the pkg directory.
17678
// In -pkg flag is specified, we will use the path specified by the flag instead

0 commit comments

Comments
 (0)