summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/dbm/dbm.c2
-rw-r--r--ext/gdbm/gdbm.c3
-rw-r--r--ext/sdbm/init.c2
-rw-r--r--pack.c18
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 <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tk.rb: ditto
+Fri Nov 12 00:31:05 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * ext/gdbm/gdbm.c (fgdbm_store): StringValue() may alter string
+ pointer. [ruby-dev:24783]
+
Thu Nov 11 17:36:12 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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");
}