Skip to content

Commit

Permalink
platform/x86: think-lmi: Return EINVAL when kbdlang gets set to a 0 l…
Browse files Browse the repository at this point in the history
…ength string

Commit 0ddcf3a ("platform/x86: think-lmi: Avoid potential read before
start of the buffer") moved the length == 0 up to before stripping the '\n'
which typically gets added when users echo a value to a sysfs-attribute
from the shell.

This avoids a potential buffer-underrun, but it also causes a behavioral
change, prior to this change "echo > kbdlang", iow writing just a single
'\n' would result in an EINVAL error, but after the change this gets
accepted setting kbdlang to an empty string.

Fix this by replacing the manual '\n' check with using strchrnul() to get
the length till '\n' or terminating 0 in one go; and then do the
length != 0 check after this.

Fixes: 0ddcf3a ("platform/x86: think-lmi: Avoid potential read before start of the buffer")
Reported-by: Juha Leppänen <juha_efku@dnainternet.net>
Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20210621193648.44138-1-hdegoede@redhat.com
  • Loading branch information
Hans de Goede committed Jun 22, 2021
1 parent 72fbcac commit 71d69e8
Showing 1 changed file with 3 additions and 8 deletions.
11 changes: 3 additions & 8 deletions drivers/platform/x86/think-lmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,14 +442,9 @@ static ssize_t kbdlang_store(struct kobject *kobj,
struct tlmi_pwd_setting *setting = to_tlmi_pwd_setting(kobj);
int length;

length = strlen(buf);
if (!length)
return -EINVAL;

if (buf[length-1] == '\n')
length--;

if (length >= TLMI_LANG_MAXLEN)
/* Calculate length till '\n' or terminating 0 */
length = strchrnul(buf, '\n') - buf;
if (!length || length >= TLMI_LANG_MAXLEN)
return -EINVAL;

memcpy(setting->kbdlang, buf, length);
Expand Down

0 comments on commit 71d69e8

Please sign in to comment.