Whamcloud - gitweb
LU-18896 utils: don't miss null-terminator in append_param 85/58685/8
authorMikhail Pershin <mpershin@whamcloud.com>
Fri, 4 Apr 2025 13:29:07 +0000 (16:29 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 25 Apr 2025 00:51:49 +0000 (00:51 +0000)
The code to move tail can skip null-terminator if there is
no tail and parameter is the last one.

Fixes: f9d346f0c1 ("LU-18587 utils: allow large NID lists in mount tools")
Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: I088f7a0eda80a9df1d55b19db28793aa488cc95e
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/58685
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/tests/conf-sanity.sh
lustre/utils/mount_utils.c

index 4dd2c81..aeab954 100755 (executable)
@@ -6792,6 +6792,25 @@ test_73b() {
 }
 run_test 73b "Large failnode NID list in mountdata"
 
+test_73d() { #LU-18896
+       (( $OST1_VERSION >= $(version_code 2.16.53) )) ||
+               skip "need OST >= 2.16.53 for LU-18896 fix"
+       [[ "$ost1_FSTYPE" == zfs ]] && import_zpool ost1
+
+       local ostdev=$(ostdevname 1)
+
+       # add bogus param to mountdata
+       do_facet ost1 "$TUNEFS --erase-params \
+               --param=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=1 $ostdev"
+       do_facet ost1 "$TUNEFS --erase-params --mgsnode=10.23.7.1@tcp \
+               --mgsnode=10.23.7.2@tcp $ostdev"
+       bad=$(do_facet ost1 "$TUNEFS --erase-params" $ostdev | grep -c "xx=1")
+       reformat
+
+       (( bad == 0 )) || error "garbage in params"
+}
+run_test 73d "erase + new parameter doesn't corrupt mountdata"
+
 # LU-15246
 test_74() {
        (( $MDS1_VERSION >= $(version_code 2.15.57.16) )) ||
index 3239d1d..8224929 100644 (file)
@@ -143,7 +143,7 @@ int add_param(char *buf, char *key, char *val)
 
 int append_param(char *buf, char *key, char *val, char sep)
 {
-       char *ptr = NULL, *next, *cur;
+       char *ptr = NULL, *next;
        int bufsize = MAXNIDSTR;
        int buflen = strlen(buf), vallen = strlen(val);
 
@@ -162,10 +162,8 @@ int append_param(char *buf, char *key, char *val, char sep)
        }
 
        next = strchrnul(ptr, ' ');
-       cur = buf + buflen;
-       /* shift tail further at vallen + sep */
-       while (cur-- > next)
-               *(cur + vallen + 1) = *cur;
+       /* shift all after 'next' further at vallen + sep */
+       memmove(next + vallen + 1, next, strlen(next) + 1);
 
        /* fill gap with sep + new values */
        *next = sep;