From: K.Kosako Date: Tue, 26 Feb 2019 04:54:06 +0000 (+0900) Subject: embed string into Operation structure X-Git-Tag: v6.9.2_rc1~65^2~17 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=39ceee333715a4e3abc2b6968bf935e0b50a2af9;p=onig embed string into Operation structure --- diff --git a/src/regcomp.c b/src/regcomp.c index 8fa7f65..e4dfa5d 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -225,7 +225,6 @@ ops_free(regex_t* reg) case OP_EXACT1: case OP_EXACT2: case OP_EXACT3: case OP_EXACT4: case OP_EXACT5: case OP_EXACTMB2N1: case OP_EXACTMB2N2: case OP_EXACTMB2N3: case OP_EXACT1_IC: - xfree(op->exact.s); break; case OP_CCLASS_NOT: case OP_CCLASS: @@ -555,6 +554,7 @@ add_compile_string(UChar* s, int mb_len, int str_len, { int op; int r; + int byte_len; UChar* p; UChar* end; @@ -562,25 +562,31 @@ add_compile_string(UChar* s, int mb_len, int str_len, r = add_op(reg, op); if (r != 0) return r; - end = s + (mb_len * str_len); - p = onigenc_strdup(reg->enc, s, end); - CHECK_NULL_RETURN_MEMERR(p); + byte_len = mb_len * str_len; + end = s + byte_len; if (op == OP_EXACTMBN) { + p = onigenc_strdup(reg->enc, s, end); + CHECK_NULL_RETURN_MEMERR(p); + COP(reg)->exact_len_n.len = mb_len; COP(reg)->exact_len_n.n = str_len; COP(reg)->exact_len_n.s = p; } else if (IS_NEED_STR_LEN_OP_EXACT(op)) { + p = onigenc_strdup(reg->enc, s, end); + CHECK_NULL_RETURN_MEMERR(p); + if (op == OP_EXACTN_IC) - COP(reg)->exact_n.n = mb_len * str_len; + COP(reg)->exact_n.n = byte_len; else COP(reg)->exact_n.n = str_len; COP(reg)->exact_n.s = p; } else { - COP(reg)->exact.s = p; + xmemcpy(COP(reg)->exact.s, s, (size_t )byte_len); + COP(reg)->exact.s[byte_len] = '\0'; } return 0; diff --git a/src/regint.h b/src/regint.h index 7d7f6d2..0552182 100644 --- a/src/regint.h +++ b/src/regint.h @@ -809,7 +809,7 @@ typedef struct { #endif union { struct { - UChar* s; + UChar s[16]; /* Now used first 7 bytes only. */ } exact; struct { UChar* s;