Re: git: aae67a2c2b66 - main - mfiutil: Fix unsafe assumptions of snprintf(3) return value

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Sat, 14 Jun 2025 12:42:40 UTC
On 6/12/25 21:21, Warner Losh wrote:
> The branch main has been updated by imp:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=aae67a2c2b663a6bce8fbc087ff8490336b8618f
> 
> commit aae67a2c2b663a6bce8fbc087ff8490336b8618f
> Author:     WHR <whr@rivoreo.one>
> AuthorDate: 2024-09-03 10:19:04 +0000
> Commit:     Warner Losh <imp@FreeBSD.org>
> CommitDate: 2025-06-13 01:21:44 +0000
> 
>      mfiutil: Fix unsafe assumptions of snprintf(3) return value
>      
>      PR: 281160
>      Reviewed by: imp
>      Pull Request: https://github.com/freebsd/freebsd-src/pull/1405
>      Closes: https://github.com/freebsd/freebsd-src/pull/1405
> ---
>   usr.sbin/mfiutil/mfi_bbu.c | 17 +++++++++++++++--
>   1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/usr.sbin/mfiutil/mfi_bbu.c b/usr.sbin/mfiutil/mfi_bbu.c
> index 9075c4d0ddd0..e97227d47c70 100644
> --- a/usr.sbin/mfiutil/mfi_bbu.c
> +++ b/usr.sbin/mfiutil/mfi_bbu.c
> @@ -50,10 +50,23 @@ mfi_autolearn_period(uint32_t period, char *buf, size_t sz)
>   
>   	tmp = buf;
>   	if (d != 0) {
> -		tmp += snprintf(buf, sz, "%u day%s", d, d == 1 ? "" : "s");
> +		int fmt_len;
> +		fmt_len = snprintf(buf, sz, "%u day%s", d, d == 1 ? "" : "s");
> +		if (fmt_len < 0) {
> +			*buf = 0;
> +			return;
> +		}
> +		if ((size_t)fmt_len >= sz) {
> +			return;
> +		}
> +		tmp += fmt_len;
>   		sz -= tmp - buf;
>   		if (h != 0) {
> -			tmp += snprintf(tmp, sz, ", ");
> +			fmt_len = snprintf(tmp, sz, ", ");
> +			if (fmt_len < 0 || (size_t)fmt_len >= sz) {
> +				return;
> +			}
> +			tmp += fmt_len;
>   			sz -= 2;
>   		}
>   	}

It seems like using a string builder like fmemopen() or sbuf() would be
better here than fragile dances with snprintf().

-- 
John Baldwin