summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-19 01:11:04 (GMT)
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-19 01:11:04 (GMT)
commit95de2b001247b5e8ccd89d5ba7225d42aafec1e5 (patch)
treec41b3bbde5e8c505e54317a1df9152d1dc63deef /marshal.c
parent8233f969a28e03bf7771424cf5a893369a14e5df (diff)
* internal.h (struct RBignum): Use size_t for len.
* include/ruby/intern.h (rb_big_new): Use size_t instead of long to specify the size of bignum. (rb_big_resize): Ditto. * bignum.c: Follow above changes. * rational.c: Follow above changes. * marshal.c: Follow above changes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/marshal.c b/marshal.c
index d828043..c45cd03 100644
--- a/marshal.c
+++ b/marshal.c
@@ -35,8 +35,8 @@
#if SIZEOF_SHORT == SIZEOF_BDIGIT
#define SHORTLEN(x) (x)
#else
-static long
-shortlen(long len, BDIGIT *ds)
+static size_t
+shortlen(size_t len, BDIGIT *ds)
{
BDIGIT num;
int offset = 0;
@@ -774,11 +774,17 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
w_byte(TYPE_BIGNUM, arg);
{
char sign = BIGNUM_SIGN(obj) ? '+' : '-';
- long len = BIGNUM_LEN(obj);
+ size_t len = BIGNUM_LEN(obj);
+ size_t slen;
BDIGIT *d = BIGNUM_DIGITS(obj);
+ slen = SHORTLEN(len);
+ if (LONG_MAX < slen) {
+ rb_raise(rb_eTypeError, "too big Bignum can't be dumped");
+ }
+
w_byte(sign, arg);
- w_long(SHORTLEN(len), arg); /* w_short? */
+ w_long((long)slen, arg);
while (len--) {
#if SIZEOF_BDIGIT > SIZEOF_SHORT
BDIGIT num = *d;