diff options
| -rw-r--r-- | executor/executor.cc | 5 | ||||
| -rw-r--r-- | prog/decodeexec.go | 5 | ||||
| -rw-r--r-- | prog/encodingexec.go | 13 | ||||
| -rw-r--r-- | prog/encodingexec_test.go | 1 |
4 files changed, 8 insertions, 16 deletions
diff --git a/executor/executor.cc b/executor/executor.cc index 84a8e0d43..ba2fb4bff 100644 --- a/executor/executor.cc +++ b/executor/executor.cc @@ -782,11 +782,10 @@ void execute_one() case arg_data: { uint64 size = read_input(&input_pos); size &= ~(1ull << 63); // readable flag - uint64 padded = (size + 7) & ~7; - if (input_pos + padded > input_data + kMaxInput) + if (input_pos + size > input_data + kMaxInput) fail("data arg overflow"); NONFAILING(memcpy(addr, input_pos, size)); - input_pos += padded; + input_pos += size; break; } case arg_csum: { diff --git a/prog/decodeexec.go b/prog/decodeexec.go index 4574ef845..bd92854e6 100644 --- a/prog/decodeexec.go +++ b/prog/decodeexec.go @@ -232,15 +232,14 @@ func (dec *execDecoder) read() uint64 { } func (dec *execDecoder) readBlob(size uint64) []byte { - padded := (size + 7) / 8 * 8 - if uint64(len(dec.data)) < padded { + if uint64(len(dec.data)) < size { dec.setErr(fmt.Errorf("exec program overflow")) } if dec.err != nil { return nil } data := dec.data[:size] - dec.data = dec.data[padded:] + dec.data = dec.data[size:] return data } diff --git a/prog/encodingexec.go b/prog/encodingexec.go index 2c13d452c..8e12d3491 100644 --- a/prog/encodingexec.go +++ b/prog/encodingexec.go @@ -283,7 +283,7 @@ func (w *execContext) writeArg(arg Arg) { case *DataArg: data := a.Data() if len(data) == 0 { - return + panic("writing data arg with 0 size") } w.write(execArgData) flags := uint64(len(data)) @@ -291,16 +291,11 @@ func (w *execContext) writeArg(arg Arg) { flags |= execArgDataReadable } w.write(flags) - padded := len(data) - if pad := 8 - len(data)%8; pad != 8 { - padded += pad - } - if len(w.buf) < padded { + if len(w.buf) < len(data) { w.eof = true } else { - copy(w.buf, data) - copy(w.buf[len(data):], make([]byte, 8)) - w.buf = w.buf[padded:] + n := copy(w.buf, data) + w.buf = w.buf[n:] } case *UnionArg: w.writeArg(a.Option) diff --git a/prog/encodingexec_test.go b/prog/encodingexec_test.go index 2a8ce30b3..19b7d1761 100644 --- a/prog/encodingexec_test.go +++ b/prog/encodingexec_test.go @@ -522,7 +522,6 @@ test() (async, rerun: 10) want = binary.AppendVarint(want, int64(elem)) case []byte: want = append(want, elem...) - want = append(want, make([]byte, ((len(elem)+7) & ^7)-len(elem))...) default: t.Fatalf("unexpected elem type %T %#v", e, e) } |
