aboutsummaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-12-17 17:11:08 +0100
committerDmitry Vyukov <dvyukov@google.com>2015-12-17 17:31:11 +0100
commitbbf4e353234e99f4a25ef85a8b02419b652e7401 (patch)
tree965fe1ab0b8b257bfdb2ea8000a2c1a029b609fc /ipc
parentbfc05fb926e5004fbe1b7dae29c44d8e301b2b72 (diff)
executor: export syscall execution results
Errno can be used to guide fuzzing, or detect not implemented syscalls.
Diffstat (limited to 'ipc')
-rw-r--r--ipc/ipc.go13
1 files changed, 11 insertions, 2 deletions
diff --git a/ipc/ipc.go b/ipc/ipc.go
index 360125053..876d75cde 100644
--- a/ipc/ipc.go
+++ b/ipc/ipc.go
@@ -111,7 +111,7 @@ func (env *Env) Close() error {
// failed: true if executor has detected a kernel bug
// hanged: program hanged and was killed
// err0: failed to start process, or executor has detected a logical error
-func (env *Env) Exec(p *prog.Prog) (output, strace []byte, cov [][]uint32, failed, hanged bool, err0 error) {
+func (env *Env) Exec(p *prog.Prog) (output, strace []byte, cov [][]uint32, errnos []int, failed, hanged bool, err0 error) {
if p != nil {
// Copy-in serialized program.
progData := p.SerializeForExec()
@@ -154,8 +154,12 @@ func (env *Env) Exec(p *prog.Prog) (output, strace []byte, cov [][]uint32, faile
return
}
cov = make([][]uint32, len(p.Calls))
+ errnos = make([]int, len(p.Calls))
+ for i := range errnos {
+ errnos[i] = -1 // not executed
+ }
for i := uint32(0); i < ncmd; i++ {
- var callIndex, callNum, coverSize, pc uint32
+ var callIndex, callNum, errno, coverSize, pc uint32
if err := binary.Read(r, binary.LittleEndian, &callIndex); err != nil {
err0 = fmt.Errorf("failed to read output coverage: %v", err)
return
@@ -164,6 +168,10 @@ func (env *Env) Exec(p *prog.Prog) (output, strace []byte, cov [][]uint32, faile
err0 = fmt.Errorf("failed to read output coverage: %v", err)
return
}
+ if err := binary.Read(r, binary.LittleEndian, &errno); err != nil {
+ err0 = fmt.Errorf("failed to read output errno: %v", err)
+ return
+ }
if err := binary.Read(r, binary.LittleEndian, &coverSize); err != nil {
err0 = fmt.Errorf("failed to read output coverage: %v", err)
return
@@ -190,6 +198,7 @@ func (env *Env) Exec(p *prog.Prog) (output, strace []byte, cov [][]uint32, faile
cov1[j] = pc
}
cov[callIndex] = cov1
+ errnos[callIndex] = int(errno)
}
return
}