Pattern length may overflow `uint16_t`; fixed #4163

The issue is reported by `https://hackerone.com/dgaletic`.
parent c3188cac
...@@ -282,7 +282,7 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte ...@@ -282,7 +282,7 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
mrb_int pattern_length = RSTRING_LEN(v_pattern); mrb_int pattern_length = RSTRING_LEN(v_pattern);
mrb_bool flag_reverse = FALSE; mrb_bool flag_reverse = FALSE;
struct tr_pattern *pat1; struct tr_pattern *pat1;
int i = 0; mrb_int i = 0;
if(flag_reverse_enable && pattern_length >= 2 && pattern[0] == '^') { if(flag_reverse_enable && pattern_length >= 2 && pattern[0] == '^') {
flag_reverse = TRUE; flag_reverse = TRUE;
...@@ -313,8 +313,8 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte ...@@ -313,8 +313,8 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
} }
else { else {
/* in order pattern. */ /* in order pattern. */
int start_pos = i++; mrb_int start_pos = i++;
int len; mrb_int len;
while (i < pattern_length) { while (i < pattern_length) {
if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-') if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-')
...@@ -323,6 +323,9 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte ...@@ -323,6 +323,9 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
} }
len = i - start_pos; len = i - start_pos;
if (len > UINT16_MAX) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "tr pattern too long (max 65536)");
}
if (pat1 == NULL && ret) { if (pat1 == NULL && ret) {
goto nomem; goto nomem;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment