From 6361f52fc4ae682e3dae3264cee1f45876272c54 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 1 May 2010 13:15:42 -0700 Subject: gc: be pickier about slice, chan, array, and map sizes Fixes #589. R=ken2 CC=golang-dev https://golang.org/cl/1032044 --- src/pkg/runtime/slice.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src/pkg/runtime/slice.c') diff --git a/src/pkg/runtime/slice.c b/src/pkg/runtime/slice.c index c3c079c670..d967b1669b 100644 --- a/src/pkg/runtime/slice.c +++ b/src/pkg/runtime/slice.c @@ -9,17 +9,20 @@ static int32 debug = 0; // see also unsafe·NewArray -// makeslice(typ *Type, nel int, cap int) (ary []any); +// makeslice(typ *Type, len, cap int64) (ary []any); void -·makeslice(SliceType *t, uint32 nel, uint32 cap, Slice ret) +·makeslice(SliceType *t, int64 len, int64 cap, Slice ret) { - uint64 size; + uintptr size; + + if(len < 0 || (int32)len != len) + panicstring("makeslice: len out of range"); + if(cap < len || (int32)cap != cap || cap > ((uintptr)-1) / t->elem->size) + panicstring("makeslice: cap out of range"); - if(cap < nel) - cap = nel; size = cap*t->elem->size; - ret.len = nel; + ret.len = len; ret.cap = cap; if((t->elem->kind&KindNoPointers)) @@ -30,8 +33,8 @@ void FLUSH(&ret); if(debug) { - printf("makeslice(%S, %d, %d); ret=", - *t->string, nel, cap); + printf("makeslice(%S, %D, %D); ret=", + *t->string, len, cap); ·printslice(ret); } } -- cgit v1.3-5-g9baa