/
kernel_linux.go
62 lines (57 loc) · 1.61 KB
/
kernel_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package pufferpanel
import (
"bufio"
"errors"
"fmt"
"github.com/pufferpanel/pufferpanel/v3/logging"
"golang.org/x/sys/unix"
"os"
"strings"
)
func testOpenat2() {
f, err := os.Open("/proc/kallsyms")
if errors.Is(err, os.ErrNotExist) {
logging.Info.Printf("Could not open /proc/kallsyms to validate kernel support, falling back to temp file test\n%s", err.Error())
var testPath string
testPath, err = os.MkdirTemp(os.TempDir(), "puffer-openat2-test-*")
if err != nil {
panic(fmt.Errorf("failed to validate kernel support with test file\n%s", err.Error()))
}
defer func(tar string) {
_ = os.Remove(tar)
}(testPath)
var testFile *os.File
testFile, err = os.Open(testPath)
if err != nil {
panic(fmt.Errorf("failed to validate kernel support with test file\n%s", err.Error()))
}
defer Close(testFile)
//we have a file now, let's see if we can... read it with openat2
var fd int
fd, err = unix.Openat2(int(testFile.Fd()), "validate", &unix.OpenHow{
Flags: uint64(os.O_CREATE),
Mode: uint64(syscallMode(0644)),
})
if err == nil {
_ = unix.Close(fd)
useOpenat2 = true
} else if errors.Is(err, unix.EOPNOTSUPP) {
useOpenat2 = false
} else {
panic(fmt.Errorf("failed to validate kernel support with test file\n%s", err.Error()))
}
} else if err == nil {
defer Close(f)
reader := bufio.NewScanner(f)
var line string
for reader.Scan() {
line = reader.Text()
if strings.Contains(line, " t do_sys_openat2") {
useOpenat2 = true
break
}
}
} else {
panic(fmt.Errorf("Could not open /proc/kallsyms to validate kernel support\n%s", err.Error()))
}
}