From: Daniel J. <dan...@gm...> - 2016-09-01 23:44:55
|
Would this be ok? Fixing only the "critical" issue for now. (created using hg export) --8<------------------cut here------------------------------>8--- # HG changeset patch # User Daniel Jour <dan...@gm...> # Date 1472772999 -7200 # Fri Sep 02 01:36:39 2016 +0200 # Node ID f663fe7ede9f27807a97f8c44de87d96edc7f9e6 # Parent bb23fd0915fa5961a6c28f6b9f750ce98c31a560 Avoid stack overflow for large number of sub expressions in regex pattern diff -r bb23fd0915fa -r f663fe7ede9f modules/regexp/regexi.c --- a/modules/regexp/regexi.c Tue Aug 30 22:45:08 2016 -0400 +++ b/modules/regexp/regexi.c Fri Sep 02 01:36:39 2016 +0200 @@ -87,6 +87,7 @@ rettype_t rettype = CHECK_RETTYPE(STACK_2); regex_t *re; regmatch_t *ret; + size_t ret_buffer_size; skipSTACK(3); /* drop all options */ for (;;) { STACK_1 = check_fpointer(STACK_1,true); @@ -106,10 +107,16 @@ funcall(L(make_array),7); string = value1; } - begin_system_call(); - ret = (regmatch_t*)alloca((re->re_nsub+1)*sizeof(regmatch_t)); - end_system_call(); - if (ret == NULL) OS_error(); + ret_buffer_size = (re->re_nsub+1)*sizeof(regmatch_t); + if (ret_buffer_size <= BUFSIZ) { + begin_system_call(); + ret = (regmatch_t*)alloca(ret_buffer_size); + end_system_call(); + if (ret == NULL) OS_error(); + } else { + /* Don't use alloca for sizes > BUFSIZ, it's not safe! */ + ret = (regmatch_t*)clisp_malloc(ret_buffer_size); + } with_string_0(string,GLO(misc_encoding),stringz, { begin_system_call(); status = regexec(re,stringz,re->re_nsub+1,ret,eflags); @@ -142,5 +149,11 @@ case ret_bool: VALUES1(T); break; } } + if (ret_buffer_size > BUFSIZ) { + /* buffer allocated using malloc, needs to be free'd */ + begin_system_call(); + free(ret); + end_system_call(); + } skipSTACK(2); /* drop pattern & string */ } diff -r bb23fd0915fa -r f663fe7ede9f src/ChangeLog --- a/src/ChangeLog Tue Aug 30 22:45:08 2016 -0400 +++ b/src/ChangeLog Fri Sep 02 01:36:39 2016 +0200 @@ -1,3 +1,8 @@ +2016-09-02 Daniel Jour <dan...@gm...> + + * modules/regexp/regexi.c (REGEXP-EXEC): Avoid stack overflow for + large number of sub expressions + 2016-08-29 Sam Steingold <sd...@gn...> * lispbibl.d, built.d, spvw.d, spvw_garcol.d, spvw_garcol_old.d: |