git: d77e45e29f04 - stable/13 - ng_socket: Treat EEXIST from kern_kldload() as success

From: Zhenlei Huang <zlei_at_FreeBSD.org>
Date: Tue, 16 Apr 2024 04:36:41 UTC
The branch stable/13 has been updated by zlei:

URL: https://cgit.FreeBSD.org/src/commit/?id=d77e45e29f0462ea7a2eb1e56fac8fd850ea460c

commit d77e45e29f0462ea7a2eb1e56fac8fd850ea460c
Author:     Zhenlei Huang <zlei@FreeBSD.org>
AuthorDate: 2024-04-09 10:04:47 +0000
Commit:     Zhenlei Huang <zlei@FreeBSD.org>
CommitDate: 2024-04-16 04:36:16 +0000

    ng_socket: Treat EEXIST from kern_kldload() as success
    
    EEXIST is possible in a race condition.
    
    Inspired by:    ffc72591b1f5 (Don't worry if a module is already loaded ...)
    Reviewed by:    glebius
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D44633
    
    (cherry picked from commit f6f67f58c19db4f25f5c2cf4869efc7054493a55)
    (cherry picked from commit 2e8d60c6854006a391491bc2c1c48c459c32e2c4)
---
 sys/netgraph/ng_socket.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index 63180114ee3f..a6b391400f1c 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -285,11 +285,15 @@ ngc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
 		if (ng_findtype(mkp->type) == NULL) {
 			char filename[NG_TYPESIZ + 3];
 			int fileid;
+			bool loaded;
 
 			/* Not found, try to load it as a loadable module. */
 			snprintf(filename, sizeof(filename), "ng_%s",
 			    mkp->type);
 			error = kern_kldload(curthread, filename, &fileid);
+			loaded = (error == 0);
+			if (error == EEXIST)
+				error = 0;
 			if (error != 0) {
 				free(msg, M_NETGRAPH_MSG);
 				goto release;
@@ -298,9 +302,10 @@ ngc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
 			/* See if type has been loaded successfully. */
 			if (ng_findtype(mkp->type) == NULL) {
 				free(msg, M_NETGRAPH_MSG);
-				(void)kern_kldunload(curthread, fileid,
-				    LINKER_UNLOAD_NORMAL);
-				error =  ENXIO;
+				if (loaded)
+					(void)kern_kldunload(curthread, fileid,
+					    LINKER_UNLOAD_NORMAL);
+				error = ENXIO;
 				goto release;
 			}
 		}