The branch main has been updated by zlei:

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

commit f6f67f58c19db4f25f5c2cf4869efc7054493a55
Author:     Zhenlei Huang <z...@freebsd.org>
AuthorDate: 2024-04-09 10:04:47 +0000
Commit:     Zhenlei Huang <z...@freebsd.org>
CommitDate: 2024-04-09 10:04:47 +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
---
 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 c356f7d6aa12..c570584d4b44 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;
                        }
                }

Reply via email to