lparcfg_write() terminates its copy of the write by overwriting the
last byte, so a write without a trailing newline loses its last
character: "partition_entitled_capacity=5" is parsed as an empty value
and fails with -EINVAL. Terminate behind the copy instead, and refuse a
write that fills the whole buffer, which can't be terminated.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: [email protected]
Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 arch/powerpc/platforms/pseries/lparcfg.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
b/arch/powerpc/platforms/pseries/lparcfg.c
index 3280b7968cab..9882f98c0efb 100644
--- a/arch/powerpc/platforms/pseries/lparcfg.c
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
@@ -699,13 +699,12 @@ static ssize_t lparcfg_write(struct file *file, const 
char __user * buf,
        if (!firmware_has_feature(FW_FEATURE_SPLPAR))
                return -EINVAL;
 
-       if (count == 0 || count > sizeof(kbuf))
+       if (count == 0 || count >= sizeof(kbuf))
                return -EINVAL;
 
        if (copy_from_user(kbuf, buf, count))
                return -EFAULT;
-
-       kbuf[count - 1] = '\0';
+       kbuf[count] = '\0';
        tmp = strchr(kbuf, '=');
        if (!tmp)
                return -EINVAL;

-- 
2.53.0


Reply via email to