[PATCH v2] fbarray: check file lock downgrade failure

Daniil Iskhakov dish at amicon.ru
Mon Sep 28 17:00:25 CEST 2026


If unlinking of the file fails, rte_fbarray_destroy() keeps the fbarray
mapped and attempts to downgrade the exclusive file lock back to a
shared lock. The result of this downgrade is currently ignored.

Check the return value and log a failure. Save errno immediately after
the failed unlink(), because subsequent calls may change it. Before
returning, set rte_errno to the saved value so the caller receives the
primary reason why the destroy operation failed.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: 5b61c62cfd76 ("fbarray: add internal tailq for mapped areas")
Cc: stable at dpdk.org

Signed-off-by: Daniil Iskhakov <dish at amicon.ru>
---
v2:
- preserve the unlink() error across the lock downgrade attempt
- check the lock operation result explicitly
- update the Fixes tag to the commit that introduced the unchecked
    downgrade
---
Cc: dmitry.kozliuk at gmail.com
Cc: sdl.dpdk at linuxtesting.org
Cc: rrv at amicon.ru
---
 lib/eal/common/eal_common_fbarray.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/lib/eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c
index 8bdcefb717..5b3532893c 100644
--- a/lib/eal/common/eal_common_fbarray.c
+++ b/lib/eal/common/eal_common_fbarray.c
@@ -1015,15 +1015,19 @@ rte_fbarray_destroy(struct rte_fbarray *arr)
 		/* we're OK to destroy the file */
 		eal_get_fbarray_path(path, sizeof(path), arr->name);
 		if (unlink(path)) {
+			const int unlink_errno = errno;
+
 			EAL_LOG(DEBUG, "Cannot unlink fbarray: %s",
-				strerror(errno));
-			rte_errno = errno;
+				strerror(unlink_errno));
 			/*
 			 * we're still holding an exclusive lock, so drop it to
 			 * shared.
 			 */
-			eal_file_lock(fd, EAL_FLOCK_SHARED, EAL_FLOCK_RETURN);
+			if (eal_file_lock(fd, EAL_FLOCK_SHARED, EAL_FLOCK_RETURN) != 0)
+				EAL_LOG(DEBUG, "Cannot restore fbarray shared lock: %s",
+					rte_strerror(rte_errno));
 
+			rte_errno = unlink_errno;
 			ret = -1;
 			goto out;
 		}
-- 
2.53.0



More information about the stable mailing list