diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-02-26 15:00:46 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-02-26 15:00:46 +0100 |
| commit | 14dae29c2abebd8886909c7a09c5795ffdd11515 (patch) | |
| tree | 50ed602aa0d992d51393bee841b2925a459ae0d4 /prog/decodeexec.go | |
| parent | 41f6f2579b51e89b33bff9f02830510d2b74d7c3 (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.go | 38 |
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()), |
