From fa521485718447e8a936ae9bddb6df2e9aa60705 Mon Sep 17 00:00:00 2001 From: matz Date: Sun, 14 Nov 2004 16:01:45 +0000 Subject: * ext/gdbm/gdbm.c (fgdbm_store): StringValue() may alter string pointer. [ruby-dev:24783] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7268 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/dbm/dbm.c | 2 +- ext/gdbm/gdbm.c | 3 ++- ext/sdbm/init.c | 2 +- pack.c | 18 +++++++++++++----- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e2afaa1c0..683fb618e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,11 @@ Fri Nov 12 14:08:01 2004 Hidetoshi NAGAI * ext/tk/lib/tk.rb: ditto +Fri Nov 12 00:31:05 2004 Yukihiro Matsumoto + + * ext/gdbm/gdbm.c (fgdbm_store): StringValue() may alter string + pointer. [ruby-dev:24783] + Thu Nov 11 17:36:12 2004 Nobuyoshi Nakada * dir.c (rb_globi): also should call back via rb_glob_caller(). diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c index e609327c46..b3bd3d2c0c 100644 --- a/ext/dbm/dbm.c +++ b/ext/dbm/dbm.c @@ -494,11 +494,11 @@ fdbm_store(obj, keystr, valstr) fdbm_modify(obj); keystr = rb_obj_as_string(keystr); + valstr = rb_obj_as_string(valstr); key.dptr = RSTRING(keystr)->ptr; key.dsize = RSTRING(keystr)->len; - valstr = rb_obj_as_string(valstr); val.dptr = RSTRING(valstr)->ptr; val.dsize = RSTRING(valstr)->len; diff --git a/ext/gdbm/gdbm.c b/ext/gdbm/gdbm.c index 799445a89c..ac208efbe8 100644 --- a/ext/gdbm/gdbm.c +++ b/ext/gdbm/gdbm.c @@ -598,10 +598,11 @@ fgdbm_store(obj, keystr, valstr) rb_gdbm_modify(obj); StringValue(keystr); + StringValue(valstr); + key.dptr = RSTRING(keystr)->ptr; key.dsize = RSTRING(keystr)->len; - StringValue(valstr); val.dptr = RSTRING(valstr)->ptr; val.dsize = RSTRING(valstr)->len; diff --git a/ext/sdbm/init.c b/ext/sdbm/init.c index ed39769e7a..ae519c460f 100644 --- a/ext/sdbm/init.c +++ b/ext/sdbm/init.c @@ -477,11 +477,11 @@ fsdbm_store(obj, keystr, valstr) fdbm_modify(obj); StringValue(keystr); + StringValue(valstr); key.dptr = RSTRING(keystr)->ptr; key.dsize = RSTRING(keystr)->len; - StringValue(valstr); val.dptr = RSTRING(valstr)->ptr; val.dsize = RSTRING(valstr)->len; diff --git a/pack.c b/pack.c index 47262f5d9f..7bbb1743f3 100644 --- a/pack.c +++ b/pack.c @@ -253,11 +253,11 @@ endian() #undef ntohl #undef htons #undef htonl +#endif #define ntohs(x) swaps(x) #define ntohl(x) swapl(x) #define htons(x) swaps(x) #define htonl(x) swapl(x) -#endif #define ntohf(x) swapf(x) #define ntohd(x) swapd(x) #define htonf(x) swapf(x) @@ -732,7 +732,6 @@ pack_pack(ary, fmt) break; case 'l': /* signed long */ - case 'L': /* unsigned long */ while (len-- > 0) { long l; @@ -741,6 +740,15 @@ pack_pack(ary, fmt) rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); } break; + case 'L': /* unsigned long */ + while (len-- > 0) { + long l; + + from = NEXTFROM; + l = NUM2U32(from); + rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); + } + break; case 'q': /* signed quad (64bit) int */ case 'Q': /* unsigned quad (64bit) int */ @@ -769,7 +777,7 @@ pack_pack(ary, fmt) unsigned long l; from = NEXTFROM; - l = NUM2I32(from); + l = NUM2U32(from); l = NATINT_HTONL(l); rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); } @@ -791,7 +799,7 @@ pack_pack(ary, fmt) unsigned long l; from = NEXTFROM; - l = NUM2I32(from); + l = NUM2U32(from); l = NATINT_HTOVL(l); rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); } @@ -904,7 +912,7 @@ pack_pack(ary, fmt) from = NEXTFROM; from = rb_to_int(from); - l = NUM2INT(from); + l = NUM2UINT(from); if (l < 0) { rb_raise(rb_eRangeError, "pack(U): value out of range"); } -- cgit v1.2.3