--------------070802030403000600070606
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Both errors stem from the possibility of returning a -1, which signals
an error condition.
I fixed it so that it silently returns without possibly doing an invalid
memory read.
Is there a more appropriate way to signal an error or throw an exception
in these cases?
Comments suggestions welcome.
Kevin Tew
--------------070802030403000600070606
Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0";
name egparse.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename egparse.patch"
Index: regparse.c
RCS file: /src/ruby/regparse.c,v
retrieving revision 1.25
diff -u -r1.25 regparse.c
--- regparse.c 23 Mar 2006 12:08:08 -0000 1.25
+++ regparse.c 6 May 2006 16:58:46 -0000
@@ -2152,38 +2152,41 @@
pnum opular_qualifier_num(p);
cnum opular_qualifier_num(c);
- switch(ReduceTypeTable[cnum][pnum]) {
- case RQ_DEL:
- *p c;
- break;
- case RQ_A:
- p->target ->target;
- p->lower ; p->upper EPEAT_INFINITE; p->greedy ;
- break;
- case RQ_AQ:
- p->target ->target;
- p->lower ; p->upper EPEAT_INFINITE; p->greedy ;
- break;
- case RQ_QQ:
- p->target ->target;
- p->lower ; p->upper ; p->greedy ;
- break;
- case RQ_P_QQ:
- p->target node;
- p->lower ; p->upper ; p->greedy ;
- c->lower ; c->upper EPEAT_INFINITE; c->greedy ;
- return ;
- break;
- case RQ_PQ_Q:
- p->target node;
- p->lower ; p->upper ; p->greedy ;
- c->lower ; c->upper EPEAT_INFINITE; c->greedy ;
- return ;
- break;
- case RQ_ASIS:
- p->target node;
- return ;
- break;
+ if (pnum > && cnum > )
+ {
+ switch(ReduceTypeTable[cnum][pnum]) {
+ case RQ_DEL:
+ *p c;
+ break;
+ case RQ_A:
+ p->target ->target;
+ p->lower ; p->upper EPEAT_INFINITE; p->greedy ;
+ break;
+ case RQ_AQ:
+ p->target ->target;
+ p->lower ; p->upper EPEAT_INFINITE; p->greedy ;
+ break;
+ case RQ_QQ:
+ p->target ->target;
+ p->lower ; p->upper ; p->greedy ;
+ break;
+ case RQ_P_QQ:
+ p->target node;
+ p->lower ; p->upper ; p->greedy ;
+ c->lower ; c->upper EPEAT_INFINITE; c->greedy ;
+ return ;
+ break;
+ case RQ_PQ_Q:
+ p->target node;
+ p->lower ; p->upper ; p->greedy ;
+ c->lower ; c->upper EPEAT_INFINITE; c->greedy ;
+ return ;
+ break;
+ case RQ_ASIS:
+ p->target node;
+ return ;
+ break;
+ }
}
c->target ULL_NODE;
@@ -4532,32 +4535,34 @@
nestq_num opular_qualifier_num(qn);
targetq_num opular_qualifier_num(qnt);
+ if ( nestq_num > && targetq_num > )
+ {
+ switch(ReduceTypeTable[targetq_num][nestq_num]) {
+ case RQ_ASIS:
+ break;
+
+ case RQ_DEL:
+ if (onig_verb_warn ! nig_null_warn) {
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
+ env->pattern, env->pattern_end,
+ (UChar* )"redundant nested repeat operator");
+ (*onig_verb_warn)((char* )buf);
+ }
+ goto warn_exit;
+ break;
- switch(ReduceTypeTable[targetq_num][nestq_num]) {
- case RQ_ASIS:
- break;
-
- case RQ_DEL:
- if (onig_verb_warn ! nig_null_warn) {
- onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
- env->pattern, env->pattern_end,
- (UChar* )"redundant nested repeat operator");
- (*onig_verb_warn)((char* )buf);
- }
- goto warn_exit;
- break;
-
- default:
- if (onig_verb_warn ! nig_null_warn) {
- onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
- env->pattern, env->pattern_end,
- (UChar* )"nested repeat operator %s and %s was replaced with '%s'",
- PopularQStr[targetq_num], PopularQStr[nestq_num],
- ReduceQStr[ReduceTypeTable[targetq_num][nestq_num]]);
- (*onig_verb_warn)((char* )buf);
+ default:
+ if (onig_verb_warn ! nig_null_warn) {
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
+ env->pattern, env->pattern_end,
+ (UChar* )"nested repeat operator %s and %s was replaced with '%s'",
+ PopularQStr[targetq_num], PopularQStr[nestq_num],
+ ReduceQStr[ReduceTypeTable[targetq_num][nestq_num]]);
+ (*onig_verb_warn)((char* )buf);
+ }
+ goto warn_exit;
+ break;
}
- goto warn_exit;
- break;
}
}
--------------070802030403000600070606--