aboutsummaryrefslogtreecommitdiffstats
path: root/prog/decodeexec.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-02-26 15:00:46 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-02-26 15:00:46 +0100
commit14dae29c2abebd8886909c7a09c5795ffdd11515 (patch)
tree50ed602aa0d992d51393bee841b2925a459ae0d4 /prog/decodeexec.go
parent41f6f2579b51e89b33bff9f02830510d2b74d7c3 (diff)
executor: use proper default values for resources
We currently use -1 as default value for resources when the actual value is not available. -1 is good for fd's, but is not the right default value for pointers/keys/etc. Pass from prog and use in executor proper default value for resources.
Diffstat (limited to 'prog/decodeexec.go')
-rw-r--r--prog/decodeexec.go38
1 files changed, 25 insertions, 13 deletions
diff --git a/prog/decodeexec.go b/prog/decodeexec.go
index a16461782..f8c29a517 100644
--- a/prog/decodeexec.go
+++ b/prog/decodeexec.go
@@ -8,8 +8,8 @@ import (
)
type ExecProg struct {
- Calls []ExecCall
- NumVars uint64
+ Calls []ExecCall
+ Vars []uint64
}
type ExecCall struct {
@@ -43,10 +43,11 @@ type ExecArgConst struct {
}
type ExecArgResult struct {
- Size uint64
- Index uint64
- DivOp uint64
- AddOp uint64
+ Size uint64
+ Index uint64
+ DivOp uint64
+ AddOp uint64
+ Default uint64
}
type ExecArgData struct {
@@ -71,9 +72,13 @@ func (target *Target) DeserializeExec(exec []byte) (ExecProg, error) {
if dec.err != nil {
return ExecProg{}, dec.err
}
+ if uint64(len(dec.vars)) != dec.numVars {
+ return ExecProg{}, fmt.Errorf("mismatching number of vars: %v/%v",
+ len(dec.vars), dec.numVars)
+ }
p := ExecProg{
- Calls: dec.calls,
- NumVars: dec.numVars,
+ Calls: dec.calls,
+ Vars: dec.vars,
}
return p, nil
}
@@ -83,6 +88,7 @@ type execDecoder struct {
data []byte
err error
numVars uint64
+ vars []uint64
call ExecCall
calls []ExecCall
}
@@ -139,12 +145,18 @@ func (dec *execDecoder) readArg() ExecArg {
BigEndian: (meta & (1 << 8)) != 0,
}
case execArgResult:
- return ExecArgResult{
- Size: dec.read(),
- Index: dec.read(),
- DivOp: dec.read(),
- AddOp: dec.read(),
+ arg := ExecArgResult{
+ Size: dec.read(),
+ Index: dec.read(),
+ DivOp: dec.read(),
+ AddOp: dec.read(),
+ Default: dec.read(),
+ }
+ for uint64(len(dec.vars)) <= arg.Index {
+ dec.vars = append(dec.vars, 0)
}
+ dec.vars[arg.Index] = arg.Default
+ return arg
case execArgData:
return ExecArgData{
Data: dec.readBlob(dec.read()),