From: Alex Brainman Date: Thu, 11 Aug 2011 02:23:55 +0000 (+1000) Subject: runtime: better checks for syscall.NewCallback parameter X-Git-Tag: weekly.2011-08-17~75 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c8ee9c60d2d7ca379e13fe799989aead35eac4d3;p=gostls13.git runtime: better checks for syscall.NewCallback parameter R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4859042 --- diff --git a/src/pkg/runtime/windows/thread.c b/src/pkg/runtime/windows/thread.c index 4ab043e887..e08d1b6f0e 100644 --- a/src/pkg/runtime/windows/thread.c +++ b/src/pkg/runtime/windows/thread.c @@ -347,16 +347,26 @@ static Callbacks cbs; byte * runtime·compilecallback(Eface fn, bool cleanstack) { - Func *f; - int32 argsize, n; + FuncType *ft; + Type *t; + int32 argsize, i, n; byte *p; Callback *c; - if(fn.type->kind != KindFunc) - runtime·panicstring("not a function"); - if((f = runtime·findfunc((uintptr)fn.data)) == nil) - runtime·throw("cannot find function"); - argsize = (f->args-2) * 4; + if(fn.type == nil || fn.type->kind != KindFunc) + runtime·panicstring("compilecallback: not a function"); + ft = (FuncType*)fn.type; + if(ft->out.len != 1) + runtime·panicstring("compilecallback: function must have one output parameter"); + if(((Type**)ft->out.array)[0]->size != sizeof(uintptr)) + runtime·panicstring("compilecallback: output parameter size is wrong"); + argsize = 0; + for(i=0; iin.len; i++) { + t = ((Type**)ft->in.array)[i]; + if(t->size != sizeof(uintptr)) + runtime·panicstring("compilecallback: input parameter size is wrong"); + argsize += t->size; + } // compute size of new fn. // must match code laid out below.