* Francis Giraldeau ([email protected]) wrote: > Hi, > > I want to save a string from user space through a proc file. It seems > trivial, but I have a problem with null termination. The user space > string is _not_ null terminated. Here is an hexdump of the string bytes > for "bidon" after performing copy_from_user on the kernel stack: > > [ 3163.957414] 0x62 0x69 0x64 0x6F 0x6E 0xFFFFFFDF ... > > The tracepoint I use is: > > TRACE_EVENT(lttng_uevent_cfu, > TP_PROTO(const char * str), > TP_ARGS(str), > TP_STRUCT__entry(__string_from_user(str, str)), > TP_fast_assign(tp_copy_string_from_user(str, str)), > TP_printk() > ) > > The user_strlen continues beyond the real string length because it's not > null terminated. The string length is already known (given as a > parameter of the write callback), such that I would like to copy only > this number of bytes and then set last byte to '\0'. Also, this would be > required to limit the string size. > > I have not found a way to do it with current macros. Shall a new macro > to handle this use case be added?
I think we would need to add: for TP_STRUCT__entry: __dynamic_array_from_user_text and implement, for TP_fast_assign: __dynamic_array_from_userenc_ext which will write the string length, followed by an array of bytes, copied from userspace. Look at all the "__dynamic_array" and "tp_memcpy_dyn" match in lttng-events.h as a starting point. Thanks, Mathieu > > Cheers, > > Francis Giraldeau > > > _______________________________________________ > lttng-dev mailing list > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
