From 047cff816d1457fa3894b7cd2a61752f669704c7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 8 Feb 2012 06:18:41 +0000 Subject: compiler, runtime: Check make int64 args for overflow. From-SVN: r183994 --- libgo/runtime/chan.c | 6 ++++++ libgo/runtime/go-make-slice.c | 24 ++++++++++++++++++++++++ libgo/runtime/go-new-map.c | 14 ++++++++++++++ 3 files changed, 44 insertions(+) (limited to 'libgo') diff --git a/libgo/runtime/chan.c b/libgo/runtime/chan.c index a246992..4fc2d60 100644 --- a/libgo/runtime/chan.c +++ b/libgo/runtime/chan.c @@ -130,6 +130,12 @@ __go_new_channel(ChanType *t, uintptr hint) return runtime_makechan_c(t, hint); } +Hchan* +__go_new_channel_big(ChanType *t, uint64 hint) +{ + return runtime_makechan_c(t, hint); +} + /* * generic single channel send/recv * if the bool pointer is nil, diff --git a/libgo/runtime/go-make-slice.c b/libgo/runtime/go-make-slice.c index 765e7c0..42b412c 100644 --- a/libgo/runtime/go-make-slice.c +++ b/libgo/runtime/go-make-slice.c @@ -57,3 +57,27 @@ __go_make_slice1 (const struct __go_type_descriptor *td, uintptr_t len) { return __go_make_slice2 (td, len, len); } + +struct __go_open_array +__go_make_slice2_big (const struct __go_type_descriptor *td, uint64_t len, + uint64_t cap) +{ + uintptr_t slen; + uintptr_t scap; + + slen = (uintptr_t) len; + if ((uint64_t) slen != len) + runtime_panicstring ("makeslice: len out of range"); + + scap = (uintptr_t) cap; + if ((uint64_t) scap != cap) + runtime_panicstring ("makeslice: cap out of range"); + + return __go_make_slice2 (td, slen, scap); +} + +struct __go_open_array +__go_make_slice1_big (const struct __go_type_descriptor *td, uint64_t len) +{ + return __go_make_slice2_big (td, len, len); +} diff --git a/libgo/runtime/go-new-map.c b/libgo/runtime/go-new-map.c index 288e188..eef71dd 100644 --- a/libgo/runtime/go-new-map.c +++ b/libgo/runtime/go-new-map.c @@ -125,3 +125,17 @@ __go_new_map (const struct __go_map_descriptor *descriptor, uintptr_t entries) __builtin_memset (ret->__buckets, 0, entries * sizeof (void *)); return ret; } + +/* Allocate a new map when the argument to make is a large type. */ + +struct __go_map * +__go_new_map_big (const struct __go_map_descriptor *descriptor, + uint64_t entries) +{ + uintptr_t sentries; + + sentries = (uintptr_t) entries; + if ((uint64_t) sentries != entries) + runtime_panicstring ("map size out of range"); + return __go_new_map (descriptor, sentries); +} -- cgit v1.1