Linux NFS development
 help / color / mirror / Atom feed
* [PATCH 1/1] nfs-utils: mount: fix snprintf return value handling in error formatting
@ 2026-08-25 18:53 Olga Kornievskaia
  2026-08-31 22:59 ` Steve Dickson
  0 siblings, 1 reply; 2+ messages in thread
From: Olga Kornievskaia @ 2026-08-25 18:53 UTC (permalink / raw)
  To: steved; +Cc: linux-nfs

snprintf() returns the number of bytes that would have been written
if sufficient space were available, not the number actually written.
When the formatted string exceeds PATH_MAX (e.g. due to a long
progname), the return value exceeds the buffer size. Using that
unclamped value as an index into errbuf produces an out-of-bounds
pointer, and subsequent snprintf() calls write past the buffer.

Add errbuf_clamp() to bound the position to the valid range before
it is used as a buffer index. Apply it in rpc_mount_errors(),
sys_mount_errors(), and rpc_strerror().

Fixes: 6e54f6179cb9 ("text-based mount.nfs: Add text-based error reporting function")
Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
---
 utils/mount/error.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/utils/mount/error.c b/utils/mount/error.c
index d6cbdea1..4dace8f5 100644
--- a/utils/mount/error.c
+++ b/utils/mount/error.c
@@ -54,6 +54,21 @@ extern char *progname;
 static char errbuf[PATH_MAX];
 static char *erreob = &errbuf[PATH_MAX];
 
+/*
+ * Clamp a buffer position to the valid range for errbuf.
+ * snprintf() returns the number of bytes that would have been written,
+ * which can exceed the buffer size on truncation.  Using that unclamped
+ * value as an index into errbuf produces an out-of-bounds pointer.
+ */
+static int errbuf_clamp(int pos)
+{
+	if (pos < 0)
+		return 0;
+	if (pos >= PATH_MAX)
+		return PATH_MAX - 1;
+	return pos;
+}
+
 /* Convert RPC errors into strings */
 static int rpc_strerror(int spos)
 {
@@ -62,6 +77,8 @@ static int rpc_strerror(int spos)
 	char *ptr, *estr = clnt_sperrno(cf_stat);
 	char *tmp;
 
+	spos = errbuf_clamp(spos);
+
 	if (estr) {
 		if ((ptr = strchr(estr, ':')))
 			estr = ++ptr;
@@ -72,9 +89,9 @@ static int rpc_strerror(int spos)
 					_("System Error: %s"),
 						strerror(cf_errno));
 		else {
-			if (cf_errno) 
+			if (cf_errno)
 				pos = snprintf(tmp, (erreob - tmp),
-					_("RPC Error:%s; errno = %s"), 
+					_("RPC Error:%s; errno = %s"),
 					estr, strerror(cf_errno));
 			else
 				pos = snprintf(tmp, (erreob - tmp),
@@ -109,6 +126,7 @@ void rpc_mount_errors(char *server, int will_retry, int bg)
 				_("%s: mount to NFS server '%s' failed: "),
 					progname, server);
 
+	pos = errbuf_clamp(pos);
 	tmp = &errbuf[pos];
 	if (rpc_createerr.cf_stat == RPC_TIMEDOUT) {
 		if (will_retry)
@@ -119,6 +137,7 @@ void rpc_mount_errors(char *server, int will_retry, int bg)
 					_("timed out, giving up"));
 	} else {
 		pos += rpc_strerror(pos);
+		pos = errbuf_clamp(pos);
 		tmp = &errbuf[pos];
 		if (bg) {
 			if (will_retry)
@@ -164,6 +183,7 @@ void sys_mount_errors(char *server, int error, int will_retry, int bg)
 				_("%s: mount to NFS server '%s' failed: "),
 					progname, server);
 
+	pos = errbuf_clamp(pos);
 	tmp = &errbuf[pos];
 	if (error == ETIMEDOUT) {
 		if (will_retry)
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 1/1] nfs-utils: mount: fix snprintf return value handling in error formatting
  2026-08-25 18:53 [PATCH 1/1] nfs-utils: mount: fix snprintf return value handling in error formatting Olga Kornievskaia
@ 2026-08-31 22:59 ` Steve Dickson
  0 siblings, 0 replies; 2+ messages in thread
From: Steve Dickson @ 2026-08-31 22:59 UTC (permalink / raw)
  To: Olga Kornievskaia; +Cc: linux-nfs



On 8/25/26 2:53 PM, Olga Kornievskaia wrote:
> snprintf() returns the number of bytes that would have been written
> if sufficient space were available, not the number actually written.
> When the formatted string exceeds PATH_MAX (e.g. due to a long
> progname), the return value exceeds the buffer size. Using that
> unclamped value as an index into errbuf produces an out-of-bounds
> pointer, and subsequent snprintf() calls write past the buffer.
> 
> Add errbuf_clamp() to bound the position to the valid range before
> it is used as a buffer index. Apply it in rpc_mount_errors(),
> sys_mount_errors(), and rpc_strerror().
> 
> Fixes: 6e54f6179cb9 ("text-based mount.nfs: Add text-based error reporting function")
> Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
Committed... (tag: nfs-utils-2-9-3-rc2)

steved.
> ---
>   utils/mount/error.c | 24 ++++++++++++++++++++++--
>   1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/utils/mount/error.c b/utils/mount/error.c
> index d6cbdea1..4dace8f5 100644
> --- a/utils/mount/error.c
> +++ b/utils/mount/error.c
> @@ -54,6 +54,21 @@ extern char *progname;
>   static char errbuf[PATH_MAX];
>   static char *erreob = &errbuf[PATH_MAX];
>   
> +/*
> + * Clamp a buffer position to the valid range for errbuf.
> + * snprintf() returns the number of bytes that would have been written,
> + * which can exceed the buffer size on truncation.  Using that unclamped
> + * value as an index into errbuf produces an out-of-bounds pointer.
> + */
> +static int errbuf_clamp(int pos)
> +{
> +	if (pos < 0)
> +		return 0;
> +	if (pos >= PATH_MAX)
> +		return PATH_MAX - 1;
> +	return pos;
> +}
> +
>   /* Convert RPC errors into strings */
>   static int rpc_strerror(int spos)
>   {
> @@ -62,6 +77,8 @@ static int rpc_strerror(int spos)
>   	char *ptr, *estr = clnt_sperrno(cf_stat);
>   	char *tmp;
>   
> +	spos = errbuf_clamp(spos);
> +
>   	if (estr) {
>   		if ((ptr = strchr(estr, ':')))
>   			estr = ++ptr;
> @@ -72,9 +89,9 @@ static int rpc_strerror(int spos)
>   					_("System Error: %s"),
>   						strerror(cf_errno));
>   		else {
> -			if (cf_errno)
> +			if (cf_errno)
>   				pos = snprintf(tmp, (erreob - tmp),
> -					_("RPC Error:%s; errno = %s"),
> +					_("RPC Error:%s; errno = %s"),
>   					estr, strerror(cf_errno));
>   			else
>   				pos = snprintf(tmp, (erreob - tmp),
> @@ -109,6 +126,7 @@ void rpc_mount_errors(char *server, int will_retry, int bg)
>   				_("%s: mount to NFS server '%s' failed: "),
>   					progname, server);
>   
> +	pos = errbuf_clamp(pos);
>   	tmp = &errbuf[pos];
>   	if (rpc_createerr.cf_stat == RPC_TIMEDOUT) {
>   		if (will_retry)
> @@ -119,6 +137,7 @@ void rpc_mount_errors(char *server, int will_retry, int bg)
>   					_("timed out, giving up"));
>   	} else {
>   		pos += rpc_strerror(pos);
> +		pos = errbuf_clamp(pos);
>   		tmp = &errbuf[pos];
>   		if (bg) {
>   			if (will_retry)
> @@ -164,6 +183,7 @@ void sys_mount_errors(char *server, int error, int will_retry, int bg)
>   				_("%s: mount to NFS server '%s' failed: "),
>   					progname, server);
>   
> +	pos = errbuf_clamp(pos);
>   	tmp = &errbuf[pos];
>   	if (error == ETIMEDOUT) {
>   		if (will_retry)


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-08-31 22:59 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-25 18:53 [PATCH 1/1] nfs-utils: mount: fix snprintf return value handling in error formatting Olga Kornievskaia
2026-08-31 22:59 ` Steve Dickson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox