Re: [PATCH net-next] bpf: add support for %s specifier to bpf_trace_printk()

From: Alexei Starovoitov
Date: Thu Aug 27 2015 - 19:06:24 EST


On 8/27/15 3:34 PM, David Miller wrote:
From: Alexei Starovoitov <ast@xxxxxxxxxxxx>
Date: Wed, 26 Aug 2015 23:26:59 -0700

+/* similar to strncpy_from_user() but with extra checks */
+static void probe_read_string(char *buf, int size, long unsafe_ptr)
+{
+ char dst[4];
+ int i = 0;
+
+ size--;
+ for (;;) {
+ if (probe_kernel_read(dst, (void *) unsafe_ptr, 4))
+ break;

I don't think this does the right thing when the string is not a multiple
of 3 and ends at the last byte of a page that ends a valid region of
kernel memory.

Seeing this kind of error makes me skeptical to the overall value of
optimizing this :-/

I've considered the case when first two bytes are valid, but the
other two are in a different page. In such case the probe_read_string()
will trim the string and won't be printing these two valid bytes.
I think that's very rare, so I'm picking higher performance for common
case. The strings over > 64 bytes also will be trimmed to 64.
It's a debugging facility, so I felt that's ok.
Fair or you still think it should be per byte copy?

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/