----- Original Message -----
Hi Dave,
I met stack smashing detection by glibc at read_string()
then this patch is proposal.
*** stack smashing detected ***: crash terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x4c)[0xfe12380]
/lib/libc.so.6(__fortify_fail+0x0)[0xfe12334]
./crash[0x10147bf0]
./crash(display_sys_stats+0xcf8)[0x1011cd74]
./crash(main_loop+0x300)[0x10068960]
./crash(current_interp_command_loop+0x48)[0x1021ac2c]
./crash[0x1021bcc4]
./crash(catch_errors+0x84)[0x1021a0c4]
./crash[0x1021d37c]
./crash(catch_errors+0x84)[0x1021a0c4]
./crash(gdb_main+0x58)[0x1021d3e8]
./crash(gdb_main_entry+0x6c)[0x1021d490]
./crash(gdb_main_loop+0x3b4)[0x10130e5c]
./crash(main+0x38c0)[0x10068650]
/lib/libc.so.6(+0x1f568)[0xfd36568]
/lib/libc.so.6(+0x1f728)[0xfd36728]
An failed vmalloc() including non terminated with NULLCHAR is root cause,
but I think it is better to keep other utilities without killed.
This patch changes the return value of read_string() in a
situation where the requested number of bytes does not include
a NULL terminator. Note that the function is described like
this:
/*
* Try to read a string of non-NULL characters from a memory location,
* returning the number of characters read.
*/
int
read_string(ulong kvaddr, char *buf, int maxlen)
{
The "maxlen" parameter is there to handle case where the requested
memory read does not contain a NULL character. And there may be
other callers that use the function to read until a NULL *or* until
the maxlen is reached.
That being said, there may be a bug in there somewhere, or it
could be written differently, but I don't want to change the
function's behavior (return value).
You mention:
an failed vmalloc() including non terminated with NULLCHAR
is the root cause".
Can you elaborate on what you mean by that? I want to be able
to reproduce this, but I cannot.
Thanks,
Dave