Commit e8a79c9e authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

[S390] call home: fix string length handling

After copying uts->nodename to the static nodename array the static
version isn't necessarily zero termininated, since the size of the
array is one byte too short.
Afterwards doing strncat(data, nodename, strlen(nodename)); may copy
an arbitrary large amount of bytes.
Fix this by getting rid of the static array and using strncat with
proper length limit.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 4a0fb4c4
...@@ -26,7 +26,6 @@ static struct sclp_async_sccb *sccb; ...@@ -26,7 +26,6 @@ static struct sclp_async_sccb *sccb;
static int sclp_async_send_wait(char *message); static int sclp_async_send_wait(char *message);
static struct ctl_table_header *callhome_sysctl_header; static struct ctl_table_header *callhome_sysctl_header;
static DEFINE_SPINLOCK(sclp_async_lock); static DEFINE_SPINLOCK(sclp_async_lock);
static char nodename[64];
#define SCLP_NORMAL_WRITE 0x00 #define SCLP_NORMAL_WRITE 0x00
struct async_evbuf { struct async_evbuf {
...@@ -52,9 +51,10 @@ static struct sclp_register sclp_async_register = { ...@@ -52,9 +51,10 @@ static struct sclp_register sclp_async_register = {
static int call_home_on_panic(struct notifier_block *self, static int call_home_on_panic(struct notifier_block *self,
unsigned long event, void *data) unsigned long event, void *data)
{ {
strncat(data, nodename, strlen(nodename)); strncat(data, init_utsname()->nodename,
sclp_async_send_wait(data); sizeof(init_utsname()->nodename));
return NOTIFY_DONE; sclp_async_send_wait(data);
return NOTIFY_DONE;
} }
static struct notifier_block call_home_panic_nb = { static struct notifier_block call_home_panic_nb = {
...@@ -183,10 +183,8 @@ static int __init sclp_async_init(void) ...@@ -183,10 +183,8 @@ static int __init sclp_async_init(void)
goto out_mem; goto out_mem;
rc = atomic_notifier_chain_register(&panic_notifier_list, rc = atomic_notifier_chain_register(&panic_notifier_list,
&call_home_panic_nb); &call_home_panic_nb);
if (rc) if (!rc)
goto out_mem; goto out;
strncpy(nodename, init_utsname()->nodename, 64);
goto out;
out_mem: out_mem:
kfree(request); kfree(request);
free_page((unsigned long) sccb); free_page((unsigned long) sccb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment