aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-07-08 22:43:41 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-07-08 22:52:24 +0200
commitfb2fc0f4dc2516a06b59913b7a5cf4472024b6c8 (patch)
tree21826897845171629cb3caad07793bbaff4566cd
parent4bf3b336ebce1eb3d5d2d453c0dae1a674af2a9f (diff)
prog: fix pointer validation
Query size after validating the object itself, otherwise size can panic on corrupted object.
-rw-r--r--prog/validation.go18
1 files changed, 9 insertions, 9 deletions
diff --git a/prog/validation.go b/prog/validation.go
index b38afc874..148640650 100644
--- a/prog/validation.go
+++ b/prog/validation.go
@@ -221,15 +221,6 @@ func (arg *UnionArg) validate(ctx *validCtx) error {
}
func (arg *PointerArg) validate(ctx *validCtx) error {
- maxMem := ctx.target.NumPages * ctx.target.PageSize
- size := arg.VmaSize
- if size == 0 && arg.Res != nil {
- size = arg.Res.Size()
- }
- if arg.Address >= maxMem || arg.Address+size > maxMem {
- return fmt.Errorf("ptr %v has bad address %v/%v/%v",
- arg.Type().Name(), arg.Address, arg.VmaSize, size)
- }
switch typ := arg.Type().(type) {
case *VmaType:
if arg.Res != nil {
@@ -256,5 +247,14 @@ func (arg *PointerArg) validate(ctx *validCtx) error {
default:
return fmt.Errorf("ptr arg %v has bad type %v", arg, typ.Name())
}
+ maxMem := ctx.target.NumPages * ctx.target.PageSize
+ size := arg.VmaSize
+ if size == 0 && arg.Res != nil {
+ size = arg.Res.Size()
+ }
+ if arg.Address >= maxMem || arg.Address+size > maxMem {
+ return fmt.Errorf("ptr %v has bad address %v/%v/%v",
+ arg.Type().Name(), arg.Address, arg.VmaSize, size)
+ }
return nil
}