Commit 35928bc3 authored by Wang Haoran's avatar Wang Haoran Committed by Tony Luck
Browse files

EDAC/{skx_common,i10nm}: Use scnprintf() for safer buffer handling



snprintf() is fragile when its return value will be used to append
additional data to a buffer. Use scnprintf() instead.

Signed-off-by: default avatarWang Haoran <haoranwangsec@gmail.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
Tested-by: default avatarQiuxu Zhuo <qiuxu.zhuo@intel.com>
Reviewed-by: default avatarQiuxu Zhuo <qiuxu.zhuo@intel.com>
Link: https://lore.kernel.org/r/20250715131700.1092720-1-haoranwangsec@gmail.com
parent b1dc7f09
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -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, "]");
	}
}

+2 −2
Original line number Diff line number Diff line
@@ -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" : "",