summaryrefslogtreecommitdiff
path: root/pack.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-08-04 04:58:25 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-08-04 04:58:25 +0000
commit9b4a611547f5c294a85200e26d66125ed990ce8b (patch)
treecc3169bcd0c1f9e42c799149e2fc4e75ad3df494 /pack.c
parent140fad80c9f0857d6625eb95297e6fb6d2eec149 (diff)
* pack.c (pack_pack): check argument overrun for 'P'. based on a
patch by rucila <rucila at yahoo.cojp>. fixed: [ruby-dev:29182] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10660 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'pack.c')
-rw-r--r--pack.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/pack.c b/pack.c
index b99906407b..8bdef7ce07 100644
--- a/pack.c
+++ b/pack.c
@@ -360,6 +360,7 @@ num2i32(VALUE x)
#else
# define QUAD_SIZE 8
#endif
+static const char toofew[] = "too few arguments";
static void encodes(VALUE,const char*,long,int);
static void qpencode(VALUE,VALUE,long);
@@ -454,8 +455,9 @@ pack_pack(VALUE ary, VALUE fmt)
items = RARRAY(ary)->len;
idx = 0;
-#define THISFROM RARRAY(ary)->ptr[idx]
-#define NEXTFROM (items-- > 0 ? RARRAY(ary)->ptr[idx++] : (rb_raise(rb_eArgError, "too few arguments"),0))
+#define TOO_FEW (rb_raise(rb_eArgError, toofew), 0)
+#define THISFROM (items > 0 ? RARRAY(ary)->ptr[idx] : TOO_FEW)
+#define NEXTFROM (items-- > 0 ? RARRAY(ary)->ptr[idx++] : TOO_FEW)
while (p < pend) {
if (RSTRING(fmt)->ptr + RSTRING(fmt)->len != pend) {
@@ -488,7 +490,7 @@ pack_pack(VALUE ary, VALUE fmt)
}
if (*p == '*') { /* set data length */
len = strchr("@Xxu", type) ? 0 : items;
- p++;
+ p++;
}
else if (ISDIGIT(*p)) {
len = strtoul(p, (char**)&p, 10);