/* Do paranoid checks, then fill in the required variables, and pass back the
pointer to the terminating '}'. */
-if (min > 65535 || max > 65535)
+if (min < 0 || min > 65535 || max < -1 || max > 65535)
*errorptr = ERR5;
else
{
compile_data compile_block;
int brastack[BRASTACK_SIZE];
uschar bralenstack[BRASTACK_SIZE];
+const size_t pattern_length = strlen(pattern);
#ifdef DEBUG
uschar *code_base, *code_end;
}
else class_charcount++;
ptr++;
+ if (*ptr == 0)
+ {
+ *errorptr = ERR6;
+ goto PCRE_ERROR_RETURN;
+ }
}
- while (*ptr != 0 && *ptr != ']');
+ while (*ptr != ']');
/* Repeats for negated single chars are handled by the general code */
/* Ordinary character or single-char escape */
runlength++;
+
+ if ((const char *)ptr > pattern + pattern_length)
+ {
+ *errorptr = "internal error";
+ goto PCRE_ERROR_RETURN;
+ }
}
/* This "while" is the end of the "do" above. */