lib: sbi: Refine the way to construct platform features
authorDong Du <Dd_nirvana@sjtu.edu.cn>
Wed, 1 Sep 2021 03:06:24 +0000 (11:06 +0800)
committerAnup Patel <anup@brainfault.org>
Fri, 3 Sep 2021 06:46:01 +0000 (12:16 +0530)
sbi_platform_get_features_str() uses sbi_snprintf() to construct the
features_str. However, it passes the wrong length value (i.e., the nfstr),
which should be (nfstr-offset) as the starting point of str (i.e.,
features_str + offset) changes.

This commit also checks the return value of snprintf, and handles the
corner case that the string buffer is full.

Signed-off-by: Dong Du <Dd_nirvana@sjtu.edu.cn>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
lib/sbi/sbi_platform.c

index 99bd8f5..445a8c1 100644 (file)
@@ -48,9 +48,18 @@ void sbi_platform_get_features_str(const struct sbi_platform *plat,
                if (features & feat) {
                        temp = sbi_platform_feature_id2string(feat);
                        if (temp) {
-                               sbi_snprintf(features_str + offset, nfstr,
-                                            "%s,", temp);
-                               offset = offset + sbi_strlen(temp) + 1;
+                               int len = sbi_snprintf(features_str + offset,
+                                                      nfstr - offset,
+                                                      "%s,", temp);
+                               if (len < 0)
+                                       break;
+
+                               if (offset + len >= nfstr) {
+                                       /* No more space for features */
+                                       offset = nfstr;
+                                       break;
+                               } else
+                                       offset = offset + len;
                        }
                }
                feat = feat << 1;