]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
EDAC/{skx_common,i10nm}: Use scnprintf() for safer buffer handling
authorWang Haoran <haoranwangsec@gmail.com>
Tue, 15 Jul 2025 13:17:00 +0000 (21:17 +0800)
committerTony Luck <tony.luck@intel.com>
Tue, 15 Jul 2025 17:06:58 +0000 (10:06 -0700)
snprintf() is fragile when its return value will be used to append
additional data to a buffer. Use scnprintf() instead.

Signed-off-by: Wang Haoran <haoranwangsec@gmail.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Tested-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Reviewed-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Link: https://lore.kernel.org/r/20250715131700.1092720-1-haoranwangsec@gmail.com
drivers/edac/i10nm_base.c
drivers/edac/skx_common.c

index c1e45c16f70ef086d75735a3181c854ceea6cb0f..bf4171ac191d3fc0c2fc7f4bbfd4e9dbe321d4b5 100644 (file)
@@ -344,7 +344,7 @@ static void show_retry_rd_err_log(struct decoded_addr *res, char *msg,
 
        status_mask = rrl->over_mask | rrl->uc_mask | rrl->v_mask;
 
-       n = snprintf(msg, len, " retry_rd_err_log[");
+       n = scnprintf(msg, len, " retry_rd_err_log[");
        for (i = 0; i < rrl->set_num; i++) {
                scrub = (rrl->modes[i] == FRE_SCRUB || rrl->modes[i] == LRE_SCRUB);
                if (scrub_err != scrub)
@@ -356,9 +356,9 @@ static void show_retry_rd_err_log(struct decoded_addr *res, char *msg,
                        log = read_imc_reg(imc, ch, offset, width);
 
                        if (width == 4)
-                               n += snprintf(msg + n, len - n, "%.8llx ", log);
+                               n += scnprintf(msg + n, len - n, "%.8llx ", log);
                        else
-                               n += snprintf(msg + n, len - n, "%.16llx ", log);
+                               n += scnprintf(msg + n, len - n, "%.16llx ", log);
 
                        /* Clear RRL status if RRL in Linux control mode. */
                        if (retry_rd_err_log == 2 && !j && (log & status_mask))
@@ -368,10 +368,10 @@ static void show_retry_rd_err_log(struct decoded_addr *res, char *msg,
 
        /* Move back one space. */
        n--;
-       n += snprintf(msg + n, len - n, "]");
+       n += scnprintf(msg + n, len - n, "]");
 
        if (len - n > 0) {
-               n += snprintf(msg + n, len - n, " correrrcnt[");
+               n += scnprintf(msg + n, len - n, " correrrcnt[");
                for (i = 0; i < rrl->cecnt_num && len - n > 0; i++) {
                        offset = rrl->cecnt_offsets[i];
                        width = rrl->cecnt_widths[i];
@@ -379,20 +379,20 @@ static void show_retry_rd_err_log(struct decoded_addr *res, char *msg,
 
                        /* CPUs {ICX,SPR} encode two counters per 4-byte CORRERRCNT register. */
                        if (res_cfg->type <= SPR) {
-                               n += snprintf(msg + n, len - n, "%.4llx %.4llx ",
+                               n += scnprintf(msg + n, len - n, "%.4llx %.4llx ",
                                              corr & 0xffff, corr >> 16);
                        } else {
                        /* CPUs {GNR} encode one counter per CORRERRCNT register. */
                                if (width == 4)
-                                       n += snprintf(msg + n, len - n, "%.8llx ", corr);
+                                       n += scnprintf(msg + n, len - n, "%.8llx ", corr);
                                else
-                                       n += snprintf(msg + n, len - n, "%.16llx ", corr);
+                                       n += scnprintf(msg + n, len - n, "%.16llx ", corr);
                        }
                }
 
                /* Move back one space. */
                n--;
-               n += snprintf(msg + n, len - n, "]");
+               n += scnprintf(msg + n, len - n, "]");
        }
 }
 
index c9ade45c1a99f31970c28d202c4deae7d1eada75..39c733dbc5b9fbaa825a8b50574160a4be8b6568 100644 (file)
@@ -670,12 +670,12 @@ static void skx_mce_output_error(struct mem_ctl_info *mci,
        }
 
        if (res->decoded_by_adxl) {
-               len = snprintf(skx_msg, MSG_SIZE, "%s%s err_code:0x%04x:0x%04x %s",
+               len = scnprintf(skx_msg, MSG_SIZE, "%s%s err_code:0x%04x:0x%04x %s",
                         overflow ? " OVERFLOW" : "",
                         (uncorrected_error && recoverable) ? " recoverable" : "",
                         mscod, errcode, adxl_msg);
        } else {
-               len = snprintf(skx_msg, MSG_SIZE,
+               len = scnprintf(skx_msg, MSG_SIZE,
                         "%s%s err_code:0x%04x:0x%04x ProcessorSocketId:0x%x MemoryControllerId:0x%x PhysicalRankId:0x%x Row:0x%x Column:0x%x Bank:0x%x BankGroup:0x%x",
                         overflow ? " OVERFLOW" : "",
                         (uncorrected_error && recoverable) ? " recoverable" : "",