Merge from HEAD - handle VFS module load failures, change some error returns to
authorAndrew Bartlett <abartlet@samba.org>
Mon, 6 Jan 2003 07:40:39 +0000 (07:40 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 6 Jan 2003 07:40:39 +0000 (07:40 +0000)
avoid sending NT_STATUS_UNSUCCESSFUL.

Andrew Bartlett

source/smbd/service.c
source/smbd/vfs.c

index d00c908a1a9396f2b56d05d3091e5f9b267d9cea..dd427c2ae841815fe3cef881e6ae31d4f0e9ca9f 100644 (file)
@@ -569,7 +569,7 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
        if (!smbd_vfs_init(conn)) {
                DEBUG(0, ("vfs_init failed for service %s\n", lp_servicename(SNUM(conn))));
                conn_free(conn);
-               *status = NT_STATUS_UNSUCCESSFUL;
+               *status = NT_STATUS_BAD_NETWORK_NAME;
                return NULL;
        }
 
@@ -598,7 +598,7 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                        DEBUG(1,("root preexec gave %d - failing connection\n", ret));
                        yield_connection(conn, lp_servicename(SNUM(conn)));
                        conn_free(conn);
-                       *status = NT_STATUS_UNSUCCESSFUL;
+                       *status = NT_STATUS_ACCESS_DENIED;
                        return NULL;
                }
        }
@@ -627,7 +627,7 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                        change_to_root_user();
                        yield_connection(conn, lp_servicename(SNUM(conn)));
                        conn_free(conn);
-                       *status = NT_STATUS_UNSUCCESSFUL;
+                       *status = NT_STATUS_ACCESS_DENIED;
                        return NULL;
                }
        }
index 7b8d9d7e9e0845de3b524f5c0360340624397476..de7b90df72619b0411d98a20cd19e0f7ab800861 100644 (file)
@@ -164,6 +164,7 @@ BOOL vfs_init_custom(connection_struct *conn, const char *vfs_object)
 
        if (init_fptr == NULL) {
                DEBUG(0, ("No vfs_init() symbol found in %s\n", vfs_object));
+               sys_dlclose(conn->vfs_private->handle);
                return False;
        }
 
@@ -171,12 +172,14 @@ BOOL vfs_init_custom(connection_struct *conn, const char *vfs_object)
 
        if ((ops = init_fptr(&vfs_version, &conn->vfs_ops, conn->vfs_private)) == NULL) {
                DEBUG(0, ("vfs_init() function from %s failed\n", vfs_object));
+               sys_dlclose(conn->vfs_private->handle);
                return False;
        }
   
        if ((vfs_version < SMB_VFS_INTERFACE_CASCADED)) {
                DEBUG(0, ("vfs_init() returned wrong interface version info (was %d, should be no less than %d)\n",
                        vfs_version, SMB_VFS_INTERFACE_VERSION ));
+               sys_dlclose(conn->vfs_private->handle);
                return False;
        }
   
@@ -184,6 +187,7 @@ BOOL vfs_init_custom(connection_struct *conn, const char *vfs_object)
                DEBUG(0, ("Warning: vfs_init() states that module confirms interface version #%d, current interface version is #%d.\n\
 Proceeding in compatibility mode, new operations (since version #%d) will fallback to default ones.\n",
                        vfs_version, SMB_VFS_INTERFACE_VERSION, vfs_version ));
+               sys_dlclose(conn->vfs_private->handle);
                return False;
        }
   
@@ -249,6 +253,8 @@ BOOL smbd_vfs_init(connection_struct *conn)
                                                DEBUG(0, ("smbd_vfs_init: vfs_init_custom failed for %s\n", vfs_module));
                                                string_free(&vfsobj);
                                                SAFE_FREE(vfs_module);
+                                               DLIST_REMOVE(conn->vfs_private, handle);
+                                               SAFE_FREE(handle);
                                                return False;
                                        }
                                        SAFE_FREE(vfs_module);