{
int icase;
struct ebmb_node *node;
- char prev;
struct pattern_tree *elt;
struct pattern_list *lst;
struct pattern *pattern;
/* Lookup a string in the expression's pattern tree. */
if (!eb_is_empty(&expr->pattern_tree)) {
- /* we may have to force a trailing zero on the test pattern */
- prev = smp->data.u.str.area[smp->data.u.str.data];
- if (prev)
- smp->data.u.str.area[smp->data.u.str.data] = '\0';
+ char prev = 0;
+
+ if (smp->data.u.str.data < smp->data.u.str.size) {
+ /* we may have to force a trailing zero on the test pattern and
+ * the buffer is large enough to accommodate it.
+ */
+ prev = smp->data.u.str.area[smp->data.u.str.data];
+ if (prev)
+ smp->data.u.str.area[smp->data.u.str.data] = '\0';
+ }
+ else {
+ /* Otherwise, the sample is duplicated. A trailing zero
+ * is automatically added to the string.
+ */
+ if (!smp_dup(smp))
+ return NULL;
+ }
+
node = ebst_lookup(&expr->pattern_tree, smp->data.u.str.area);
if (prev)
smp->data.u.str.area[smp->data.u.str.data] = prev;
-
if (node) {
if (fill) {
elt = ebmb_entry(node, struct pattern_tree, node);
{
int icase;
struct ebmb_node *node;
- char prev;
struct pattern_tree *elt;
struct pattern_list *lst;
struct pattern *pattern;
/* Lookup a string in the expression's pattern tree. */
if (!eb_is_empty(&expr->pattern_tree)) {
- /* we may have to force a trailing zero on the test pattern */
- prev = smp->data.u.str.area[smp->data.u.str.data];
- if (prev)
- smp->data.u.str.area[smp->data.u.str.data] = '\0';
+ char prev = 0;
+
+ if (smp->data.u.str.data < smp->data.u.str.size) {
+ /* we may have to force a trailing zero on the test pattern and
+ * the buffer is large enough to accommodate it.
+ */
+ prev = smp->data.u.str.area[smp->data.u.str.data];
+ if (prev)
+ smp->data.u.str.area[smp->data.u.str.data] = '\0';
+ }
+ else {
+ /* Otherwise, the sample is duplicated. A trailing zero
+ * is automatically added to the string.
+ */
+ if (!smp_dup(smp))
+ return NULL;
+ }
+
node = ebmb_lookup_longest(&expr->pattern_tree,
smp->data.u.str.area);
if (prev)