s390/ipl: Do not accept z/VM CP diag X'008' cmds longer than max length
authorAlexander Egorenkov <egorenar@linux.ibm.com>
Fri, 10 May 2024 09:39:53 +0000 (11:39 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 14 May 2024 18:21:54 +0000 (20:21 +0200)
The old implementation of vmcmd sysfs string attributes truncated passed
z/VM CP diagnose X'008' commands which were longer than the max allowed
number of characters but the reported number of written characters was
still equal to the entire length of a given string. This can result in
silent failures of some s390-tools (e.g. dumpconf) which can be very hard
to detect. Therefore, this commit makes a write attempt to a vmcmd sysfs
attribute
* fail with E2BIG error if a given string is longer than the maximum
  allowed one
* never destroy the old data in the vmcmd sysfs attribute if the new data
  doesn't fit into it entirely
* return the actual number of written characters if it succeeds

Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kernel/ipl.c

index eb3fd130ee81086f9e8c823dd4855dadcb29c116..f78c40e2b6317e34979c0e6e202d0fc42508fbef 100644 (file)
@@ -266,7 +266,11 @@ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj,       \
                struct kobj_attribute *attr,                            \
                const char *buf, size_t len)                            \
 {                                                                      \
-       strscpy(_value, buf, sizeof(_value));                           \
+       if (len >= sizeof(_value))                                      \
+               return -E2BIG;                                          \
+       len = strscpy(_value, buf, sizeof(_value));                     \
+       if (len < 0)                                                    \
+               return len;                                             \
        strim(_value);                                                  \
        return len;                                                     \
 }                                                                      \