--------------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";
 nameegparse.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filenameegparse.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--