/* }}} */
-static char *unserialize_str(const unsigned char **p, size_t *len)
+static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen)
{
size_t i, j;
char *str = safe_emalloc(*len, 1, 1);
- unsigned char *end = *(unsigned char **)p+*len;
+ unsigned char *end = *(unsigned char **)p+maxlen;
if(end < *p) {
efree(str);
return NULL;
}
- for (i = 0; i < *len && *p < end; i++) {
+ for (i = 0; i < *len; i++) {
+ if (*p >= end) {
+ efree(str);
+ return NULL;
+ }
if (**p != '\\') {
str[i] = (char)**p;
} else {
return 0;
}
- if ((str = unserialize_str(&YYCURSOR, &len)) == NULL) {
+ if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) {
return 0;
}
/* }}} */
-static char *unserialize_str(const unsigned char **p, size_t *len)
+static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen)
{
size_t i, j;
char *str = safe_emalloc(*len, 1, 1);
- unsigned char *end = *(unsigned char **)p+*len;
+ unsigned char *end = *(unsigned char **)p+maxlen;
if(end < *p) {
efree(str);
return NULL;
}
- for (i = 0; i < *len && *p < end; i++) {
+ for (i = 0; i < *len; i++) {
+ if (*p >= end) {
+ efree(str);
+ return NULL;
+ }
if (**p != '\\') {
str[i] = (char)**p;
} else {
return 0;
}
- if ((str = unserialize_str(&YYCURSOR, &len)) == NULL) {
+ if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) {
return 0;
}