1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
Taken from: [ruby-dev:21973]
Index: regparse.c
===================================================================
--- regparse.c (.../ags/oniguruma/1.9.5) (revision 245)
+++ regparse.c (.../runk/oniguruma) (revision 245)
@@ -833,6 +833,10 @@
e->back_refs = (int* )NULL;
}
}
+ if (IS_NOT_NULL(t->e)) {
+ xfree(t->e);
+ t->e = NULL;
+ }
t->num = 0;
}
return 0;
@@ -3611,6 +3615,7 @@
enum CCVALTYPE val_type, in_type;
int val_israw, in_israw;
+ prev_cc = (CClassNode* )NULL;
*np = NULL_NODE;
r = fetch_token_in_cc(tok, src, end, env);
if (r == TK_BYTE && tok->u.c == '^') {
@@ -3633,7 +3638,6 @@
*np = node = node_new_cclass();
CHECK_NULL_RETURN_VAL(node, REGERR_MEMORY);
cc = &(NCCLASS(node));
- prev_cc = (CClassNode* )NULL;
and_start = 0;
state = CCS_START;
@@ -3810,6 +3814,7 @@
if (IS_NOT_NULL(prev_cc)) {
r = and_cclass(prev_cc, cc);
if (r != 0) goto err;
+ bbuf_free(cc->mbuf);
}
else {
prev_cc = cc;
@@ -3846,6 +3851,7 @@
if (IS_NOT_NULL(prev_cc)) {
r = and_cclass(prev_cc, cc);
if (r != 0) goto err;
+ bbuf_free(cc->mbuf);
cc = prev_cc;
}
@@ -3864,6 +3870,8 @@
return 0;
err:
+ if (cc != &(NCCLASS(*np)))
+ bbuf_free(cc->mbuf);
regex_node_free(*np);
return r;
}
@@ -4490,7 +4498,10 @@
*top = NULL;
r = parse_branch(&node, tok, term, src, end, env);
- if (r < 0) return r;
+ if (r < 0) {
+ regex_node_free(node);
+ return r;
+ }
if (r == term) {
*top = node;
Index: regcomp.c
===================================================================
--- regcomp.c (.../ags/oniguruma/1.9.5) (revision 245)
+++ regcomp.c (.../runk/oniguruma) (revision 245)
@@ -3675,6 +3675,7 @@
}
else {
len = mblen(code, *p);
+ if (i + len > OPT_EXACT_MAXLEN) break;
for (j = 0; j < len; j++)
to->s[i++] = *p++;
}
|