The filter interpreter is populating the "str" register field, but the
string comparison functions expect to use the "user_str" register field
whenever it deals with a userspace string ("user" flag set to 1).
Since we are using __copy_from_user_inatomic(), this is typically
bailing out on anything that requires to read the string (except the '*'
wildcard).
Fixes #943
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
dbg_printk("load field ref offset %u type user string\n",
ref->offset);
estack_push(stack, top, ax, bx);
dbg_printk("load field ref offset %u type user string\n",
ref->offset);
estack_push(stack, top, ax, bx);
- estack_ax(stack, top)->u.s.str =
+ estack_ax(stack, top)->u.s.user_str =
*(const char * const *) &filter_stack_data[ref->offset];
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
dbg_printk("Filter warning: loading a NULL string.\n");
*(const char * const *) &filter_stack_data[ref->offset];
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
dbg_printk("Filter warning: loading a NULL string.\n");
estack_push(stack, top, ax, bx);
estack_ax(stack, top)->u.s.seq_len =
*(unsigned long *) &filter_stack_data[ref->offset];
estack_push(stack, top, ax, bx);
estack_ax(stack, top)->u.s.seq_len =
*(unsigned long *) &filter_stack_data[ref->offset];
- estack_ax(stack, top)->u.s.str =
+ estack_ax(stack, top)->u.s.user_str =
*(const char **) (&filter_stack_data[ref->offset
+ sizeof(unsigned long)]);
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
*(const char **) (&filter_stack_data[ref->offset
+ sizeof(unsigned long)]);
if (unlikely(!estack_ax(stack, top)->u.s.str)) {