From 28a6e40302fbd3eeac1aee9434e1bcf69b1a8e25 Mon Sep 17 00:00:00 2001
From: Bernd Schubert <bschubert@ddn.com>
Date: Sat, 17 May 2025 23:52:47 +0200
Subject: [PATCH] Make conn->want/want_ext conversion non fatal

there are too many issues with conn->want and conn->want_ext
conversion, for now just log a warning, but setting both
flags is now not fatal anymore.

Signed-off-by: Bernd Schubert <bschubert@ddn.com>
---
 lib/fuse.c          | 16 +---------------
 lib/fuse_i.h        |  5 +----
 lib/fuse_lowlevel.c |  9 +--------
 3 files changed, 3 insertions(+), 27 deletions(-)

diff --git a/lib/fuse.c b/lib/fuse.c
index 49f57112a..c0d00edbc 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -2618,25 +2618,11 @@ void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn,
 	if (fs->op.init) {
 		uint64_t want_ext_default = conn->want_ext;
 		uint32_t want_default = fuse_lower_32_bits(conn->want_ext);
-		int rc;
 
 		conn->want = want_default;
 		fs->user_data = fs->op.init(conn, cfg);
 
-		rc = convert_to_conn_want_ext(conn, want_ext_default,
-					      want_default);
-
-		if (rc != 0) {
-			/*
-			 * This is a grave developer error, but
-			 * we cannot return an error here, as the function
-			 * signature does not allow it.
-			 */
-			fuse_log(
-				FUSE_LOG_ERR,
-				"fuse: Aborting due to invalid conn want flags.\n");
-			_exit(EXIT_FAILURE);
-		}
+		convert_to_conn_want_ext(conn, want_ext_default, want_default);
 	}
 }
 
diff --git a/lib/fuse_i.h b/lib/fuse_i.h
index 48b8294f3..bf5e2ca41 100644
--- a/lib/fuse_i.h
+++ b/lib/fuse_i.h
@@ -245,11 +245,8 @@ static inline int convert_to_conn_want_ext(struct fuse_conn_info *conn,
 	 */
 	if (conn->want != want_default &&
 	    fuse_lower_32_bits(conn->want_ext) != conn->want) {
-		if (conn->want_ext != want_ext_default) {
-			fuse_log(FUSE_LOG_ERR,
-				 "fuse: both 'want' and 'want_ext' are set\n");
+		if (conn->want_ext != want_ext_default)
 			return -EINVAL;
-		}
 
 		/* high bits from want_ext, low bits from want */
 		conn->want_ext = fuse_higher_32_bits(conn->want_ext) |
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 9ebaaf08e..9ee88b160 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -2160,7 +2160,6 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
 	if (se->op.init) {
 		uint64_t want_ext_default = se->conn.want_ext;
 		uint32_t want_default = fuse_lower_32_bits(se->conn.want_ext);
-		int rc;
 
 		// Apply the first 32 bits of capable_ext to capable
 		se->conn.capable = fuse_lower_32_bits(se->conn.capable_ext);
@@ -2173,14 +2172,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
 		 * se->conn.want_ext
 		 * Userspace might still use conn.want - we need to convert it
 		 */
-		rc = convert_to_conn_want_ext(&se->conn, want_ext_default,
+		convert_to_conn_want_ext(&se->conn, want_ext_default,
 					      want_default);
-		if (rc != 0) {
-			fuse_reply_err(req, EPROTO);
-			se->error = -EPROTO;
-			fuse_session_exit(se);
-			return;
-		}
 	}
 
 	if (!want_flags_valid(se->conn.capable_ext, se->conn.want_ext)) {
