]> granicus.if.org Git - onig/commitdiff
add onig_set_capture_num_limit()
authorK.Kosako <kkosako0@gmail.com>
Tue, 3 Jan 2017 12:38:35 +0000 (21:38 +0900)
committerK.Kosako <kkosako0@gmail.com>
Tue, 3 Jan 2017 12:38:35 +0000 (21:38 +0900)
src/oniguruma.h
src/regparse.c

index fcf1085d2de2f17b2a09640e292505d763b3f19c..ca4b40d70a08743053bbd1817e579f555d0fa9f3 100644 (file)
@@ -824,6 +824,8 @@ int onig_set_match_stack_limit_size P_((unsigned int size));
 ONIG_EXTERN
 unsigned int onig_get_parse_depth_limit P_((void));
 ONIG_EXTERN
+int onig_set_capture_num_limit P_((int num));
+ONIG_EXTERN
 int onig_set_parse_depth_limit P_((unsigned int depth));
 ONIG_EXTERN
 int onig_unicode_define_user_property P_((const char* name, OnigCodePoint* ranges));
index 7e923df0081c133512aa1defb5ca84ea5bd5fd4f..2bf1d9fc3d1b227df87eb4e658129b1883476e47 100644 (file)
@@ -108,6 +108,18 @@ onig_warning(const char* s)
   (*onig_warn)(s);
 }
 
+#define DEFAULT_MAX_CAPTURE_NUM   32767
+
+static int MaxCaptureNum = DEFAULT_MAX_CAPTURE_NUM;
+
+extern int
+onig_set_capture_num_limit(int num)
+{
+  if (num < 0) return -1;
+
+  MaxCaptureNum = num;
+  return 0;
+}
 
 static unsigned int ParseDepthLimit = DEFAULT_PARSE_DEPTH_LIMIT;
 
@@ -989,7 +1001,7 @@ scan_env_add_mem_entry(ScanEnv* env)
   Node** p;
 
   need = env->num_mem + 1;
-  if (need > ONIG_MAX_CAPTURE_NUM)
+  if (need > MaxCaptureNum && MaxCaptureNum != 0)
     return ONIGERR_TOO_MANY_CAPTURES;
 
   if (need >= SCANENV_MEMNODES_SIZE) {