diff options
author | Andrew Bartlett <abartlet@samba.org> | 2003-03-31 01:08:59 +0000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2003-03-31 01:08:59 +0000 |
commit | ea279249c9e20081bdb34080c2fa3b8b46c13896 (patch) | |
tree | f85954bf778fee7ca185431e4bc787f0ba7e1c93 | |
parent | 47f230b761f33210beab7f632e8ed1f111959aba (diff) | |
download | samba-ea279249c9e20081bdb34080c2fa3b8b46c13896.tar.gz samba-ea279249c9e20081bdb34080c2fa3b8b46c13896.tar.bz2 samba-ea279249c9e20081bdb34080c2fa3b8b46c13896.zip |
Don't try and dlsym or dlclose a NULL pointer.
The new modules system does not always dlopen() it's modules, and when it
does, it keeps them open for the life of the server, not the life of the
connection.
This caused a segfault on every tree disconnect!
Andrew Bartlett
(This used to be commit c76ecbae6295022d031d2e286f2d67e5d08946a2)
-rw-r--r-- | source3/smbd/conn.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index 38fa2e0237..2a77e23e73 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -201,15 +201,18 @@ void conn_free(connection_struct *conn) /* Free vfs_connection_struct */ handle = conn->vfs_private; while(handle) { - /* Close dlopen() handle */ - done_fptr = (void (*)(connection_struct *))sys_dlsym(handle->handle, "vfs_done"); - - if (done_fptr == NULL) { - DEBUG(3, ("No vfs_done() symbol found in module with handle %p, ignoring\n", handle->handle)); - } else { - done_fptr(conn); - } - sys_dlclose(handle->handle); + if (handle->handle) { + /* Close dlopen() handle */ + done_fptr = (void (*)(connection_struct *))sys_dlsym(handle->handle, "vfs_done"); + + if (done_fptr == NULL) { + DEBUG(3, ("No vfs_done() symbol found in module with handle %p, ignoring\n", handle->handle)); + } else { + done_fptr(conn); + } + sys_dlclose(handle->handle); + } + DLIST_REMOVE(conn->vfs_private, handle); thandle = handle->next; SAFE_FREE(handle); |