Reproducer
MRI 3.3.0
$ irb
[3.3.0] > puts RUBY_VERSION, RUBY_ENGINE
3.3.0
ruby
=> nil
[3.3.0] > "U2VuZCByZWluZm9yY2VtZW50cw==\n".unpack1("m")
=> "Send reinforcements"
mruby 3.2.0
$ ./bin/mirb
mirb - Embeddable Interactive Ruby Shell
> puts RUBY_VERSION, RUBY_ENGINE
3.2
mruby
=> nil
> "U2VuZCByZWluZm9yY2VtZW50cw==\n".unpack1("m")
=> ["Send reinforcements"]
Issue
The hex decode ends with a continue:
case PACK_DIR_BASE64:
srcidx += unpack_base64(mrb, sptr, srclen - srcidx, result);
continue;
which brings it to the top of the while loop. has_tmpl returns false and the if (single) block which is inside the while loop is never executed.
Fix
$ g diff
diff --git i/artichoke-backend/vendor/mruby/mrbgems/mruby-pack/src/pack.c w/artichoke-backend/vendor/mruby/mrbgems/mruby-pack/src/pack.c
index b5ecdc6479..ab51662d48 100644
--- i/mrbgems/mruby-pack/src/pack.c
+++ w/mrbgems/mruby-pack/src/pack.c
@@ -1575,12 +1575,12 @@ pack_unpack(mrb_state *mrb, mrb_value str, int single)
count--;
}
}
- if (single) {
- if (RARRAY_LEN(result) > 0) {
- return RARRAY_PTR(result)[0];
- }
- return mrb_nil_value();
+ }
+ if (single) {
+ if (RARRAY_LEN(result) > 0) {
+ return RARRAY_PTR(result)[0];
}
+ return mrb_nil_value();
}
return result;
}
Reproducer
MRI 3.3.0
mruby 3.2.0
Issue
The hex decode ends with a
continue:which brings it to the top of the while loop.
has_tmplreturns false and theif (single) blockwhich is inside the while loop is never executed.Fix