aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/ipc/ipc.go16
-rw-r--r--pkg/ipc/ipc_test.go3
-rw-r--r--pkg/osutil/osutil_linux.go30
3 files changed, 39 insertions, 10 deletions
diff --git a/pkg/ipc/ipc.go b/pkg/ipc/ipc.go
index ca740219e..b2d4c9d63 100644
--- a/pkg/ipc/ipc.go
+++ b/pkg/ipc/ipc.go
@@ -190,14 +190,15 @@ func MakeEnv(config *Config, pid int) (*Env, error) {
env.bin[0] = osutil.Abs(env.bin[0]) // we are going to chdir
// Append pid to binary name.
// E.g. if binary is 'syz-executor' and pid=15,
- // we create a link from 'syz-executor15' to 'syz-executor' and use 'syz-executor15' as binary.
+ // we create a link from 'syz-executor.15' to 'syz-executor' and use 'syz-executor.15' as binary.
// This allows to easily identify program that lead to a crash in the log.
- // Log contains pid in "executing program 15" and crashes usually contain "Comm: syz-executor15".
+ // Log contains pid in "executing program 15" and crashes usually contain "Comm: syz-executor.15".
base := filepath.Base(env.bin[0])
- pidStr := fmt.Sprint(pid)
- if len(base)+len(pidStr) >= 16 {
- // TASK_COMM_LEN is currently set to 16
- base = base[:15-len(pidStr)]
+ pidStr := fmt.Sprintf(".%v", pid)
+ const maxLen = 16 // TASK_COMM_LEN is currently set to 16
+ if len(base)+len(pidStr) >= maxLen {
+ // Remove beginning of file name, in tests temp files have unique numbers at the end.
+ base = base[len(base)+len(pidStr)-maxLen+1:]
}
binCopy := filepath.Join(filepath.Dir(env.bin[0]), base+pidStr)
if err := os.Link(env.bin[0], binCopy); err == nil {
@@ -514,8 +515,7 @@ type callReply struct {
// signal/cover/comps follow
}
-func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File, outmem []byte) (
- *command, error) {
+func makeCommand(pid int, bin []string, config *Config, inFile, outFile *os.File, outmem []byte) (*command, error) {
dir, err := ioutil.TempDir("./", "syzkaller-testdir")
if err != nil {
return nil, fmt.Errorf("failed to create temp dir: %v", err)
diff --git a/pkg/ipc/ipc_test.go b/pkg/ipc/ipc_test.go
index 8d0ca7ff5..42d066d08 100644
--- a/pkg/ipc/ipc_test.go
+++ b/pkg/ipc/ipc_test.go
@@ -127,8 +127,9 @@ func TestParallel(t *testing.T) {
const P = 10
errs := make(chan error, P)
for p := 0; p < P; p++ {
+ p := p
go func() {
- env, err := MakeEnv(cfg, 0)
+ env, err := MakeEnv(cfg, p)
if err != nil {
errs <- fmt.Errorf("failed to create env: %v", err)
return
diff --git a/pkg/osutil/osutil_linux.go b/pkg/osutil/osutil_linux.go
index f4b30b195..1ec37d45f 100644
--- a/pkg/osutil/osutil_linux.go
+++ b/pkg/osutil/osutil_linux.go
@@ -11,6 +11,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "runtime"
"strconv"
"strings"
"sync"
@@ -30,7 +31,34 @@ func RemoveAll(dir string) error {
fn := []byte(name + "\x00")
syscall.Syscall(syscall.SYS_UMOUNT2, uintptr(unsafe.Pointer(&fn[0])), syscall.MNT_FORCE, 0)
}
- return os.RemoveAll(dir)
+ if err := os.RemoveAll(dir); err != nil {
+ removeImmutable(dir)
+ return os.RemoveAll(dir)
+ }
+ return nil
+}
+
+func removeImmutable(fname string) error {
+ // Reset FS_XFLAG_IMMUTABLE/FS_XFLAG_APPEND.
+ fd, err := syscall.Open(fname, syscall.O_RDONLY, 0)
+ if err != nil {
+ return err
+ }
+ defer syscall.Close(fd)
+ flags := 0
+ var cmd uint64 // FS_IOC_SETFLAGS
+ switch runtime.GOARCH {
+ case "386", "arm":
+ cmd = 1074030082
+ case "amd64", "arm64":
+ cmd = 1074292226
+ case "ppc64le":
+ cmd = 2148034050
+ default:
+ panic("unknown arch")
+ }
+ _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(&flags)))
+ return errno
}
func Sandbox(cmd *exec.Cmd, user, net bool) error {