The branch, v3-5-test has been updated
       via  756b503... Restructure the connect function code to always call 
down to NEXT-> before initializing. This allows us to do cleanup (by calling 
DISCONNECT) if initialization fails. Also fix vfs_acl_xattr which was failing 
to call the NEXT connect function. Jeremy. (cherry picked from commit 
8303bc49a45d5bab0cdbd4f2d793088f600f715f)
      from  c0282f8... Fix bug 6546: Avoid accessing buf[-1] if NUL byte comes 
from fgets

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 756b5032032c58815a227fdfd27140373d8ebc8c
Author: Jeremy Allison <j...@samba.org>
Date:   Mon Nov 30 15:53:04 2009 -0800

    Restructure the connect function code to always call
    down to NEXT-> before initializing. This allows us to
    do cleanup (by calling DISCONNECT) if initialization
    fails. Also fix vfs_acl_xattr which was failing to
    call the NEXT connect function.
    Jeremy.
    (cherry picked from commit 8303bc49a45d5bab0cdbd4f2d793088f600f715f)

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_acl_tdb.c              |    9 ++++-----
 source3/modules/vfs_acl_xattr.c            |    6 ++++++
 source3/modules/vfs_afsacl.c               |   11 ++++++++---
 source3/modules/vfs_audit.c                |   11 +++++++----
 source3/modules/vfs_cacheprime.c           |    9 ++++++++-
 source3/modules/vfs_commit.c               |    8 +++++++-
 source3/modules/vfs_extd_audit.c           |   10 ++++++----
 source3/modules/vfs_fileid.c               |    9 ++++++++-
 source3/modules/vfs_full_audit.c           |   10 +++++-----
 source3/modules/vfs_onefs.c                |    9 +++++++--
 source3/modules/vfs_prealloc.c             |   10 ++++++++--
 source3/modules/vfs_readahead.c            |   11 +++++++++--
 source3/modules/vfs_readonly.c             |    9 +++++++--
 source3/modules/vfs_recycle.c              |    8 +++++++-
 source3/modules/vfs_smb_traffic_analyzer.c |   10 +++++++++-
 source3/modules/vfs_tsmsm.c                |   14 +++++++++++---
 16 files changed, 117 insertions(+), 37 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_acl_tdb.c b/source3/modules/vfs_acl_tdb.c
index db3881e..e9d0f90 100644
--- a/source3/modules/vfs_acl_tdb.c
+++ b/source3/modules/vfs_acl_tdb.c
@@ -367,12 +367,11 @@ static int connect_acl_tdb(struct vfs_handle_struct 
*handle,
                                const char *user)
 {
        struct db_context *db;
-       int res;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
 
-        res = SMB_VFS_NEXT_CONNECT(handle, service, user);
-        if (res < 0) {
-                return res;
-        }
+       if (ret < 0) {
+               return ret;
+       }
 
        if (!acl_tdb_init(&db)) {
                SMB_VFS_NEXT_DISCONNECT(handle);
diff --git a/source3/modules/vfs_acl_xattr.c b/source3/modules/vfs_acl_xattr.c
index 962d1b7..5e51a68 100644
--- a/source3/modules/vfs_acl_xattr.c
+++ b/source3/modules/vfs_acl_xattr.c
@@ -212,6 +212,12 @@ static int connect_acl_xattr(struct vfs_handle_struct 
*handle,
                                const char *service,
                                const char *user)
 {
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+
        /* Ensure we have "inherit acls = yes" if we're
         * using this module. */
        DEBUG(2,("connect_acl_xattr: setting 'inherit acls = true' "
diff --git a/source3/modules/vfs_afsacl.c b/source3/modules/vfs_afsacl.c
index 4666be2..82c1799 100644
--- a/source3/modules/vfs_afsacl.c
+++ b/source3/modules/vfs_afsacl.c
@@ -1065,14 +1065,19 @@ static int afsacl_connect(vfs_handle_struct *handle,
                          const char *service, 
                          const char *user)
 {
-                       const char *spc;
+       const char *spc;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
 
        spc = lp_parm_const_string(SNUM(handle->conn), "afsacl", "space", "%");
 
        if (spc != NULL)
                space_replacement = spc[0];
-       
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       return 0;
 }
 
 static struct vfs_fn_pointers vfs_afsacl_fns = {
diff --git a/source3/modules/vfs_audit.c b/source3/modules/vfs_audit.c
index 258246e..d256c2f 100644
--- a/source3/modules/vfs_audit.c
+++ b/source3/modules/vfs_audit.c
@@ -78,15 +78,18 @@ static int audit_syslog_priority(vfs_handle_struct *handle)
 static int audit_connect(vfs_handle_struct *handle, const char *svc, const 
char *user)
 {
        int result;
-       
+
+       result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
+       if (result < 0) {
+               return result;
+       }
+
        openlog("smbd_audit", LOG_PID, audit_syslog_facility(handle));
 
        syslog(audit_syslog_priority(handle), "connect to service %s by user 
%s\n", 
               svc, user);
 
-       result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
-
-       return result;
+       return 0;
 }
 
 static void audit_disconnect(vfs_handle_struct *handle)
diff --git a/source3/modules/vfs_cacheprime.c b/source3/modules/vfs_cacheprime.c
index d107c5f..02cffbb 100644
--- a/source3/modules/vfs_cacheprime.c
+++ b/source3/modules/vfs_cacheprime.c
@@ -89,6 +89,8 @@ static int cprime_connect(
                 const char *                service,
                 const char *                user)
 {
+       int ret;
+
         module_debug = lp_parm_int(SNUM(handle->conn), MODULE, "debug", 100);
         if (g_readbuf) {
                 /* Only allocate g_readbuf once. If the config changes and
@@ -98,6 +100,11 @@ static int cprime_connect(
                 return SMB_VFS_NEXT_CONNECT(handle, service, user);
         }
 
+       ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+       if (ret < 0) {
+               return ret;
+       }
+
         g_readsz = conv_str_size(lp_parm_const_string(SNUM(handle->conn),
                                         MODULE, "rsize", NULL));
 
@@ -118,7 +125,7 @@ static int cprime_connect(
                 g_readsz = 0;
         }
 
-        return SMB_VFS_NEXT_CONNECT(handle, service, user);
+        return 0;
 }
 
 static ssize_t cprime_sendfile(
diff --git a/source3/modules/vfs_commit.c b/source3/modules/vfs_commit.c
index b926112..1d09949 100644
--- a/source3/modules/vfs_commit.c
+++ b/source3/modules/vfs_commit.c
@@ -162,8 +162,14 @@ static int commit_connect(
         const char *                service,
         const char *                user)
 {
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+
         module_debug = lp_parm_int(SNUM(handle->conn), MODULE, "debug", 100);
-        return SMB_VFS_NEXT_CONNECT(handle, service, user);
+        return 0;
 }
 
 static int commit_open(
diff --git a/source3/modules/vfs_extd_audit.c b/source3/modules/vfs_extd_audit.c
index c4a20f0..80dece7 100644
--- a/source3/modules/vfs_extd_audit.c
+++ b/source3/modules/vfs_extd_audit.c
@@ -80,7 +80,11 @@ static int audit_syslog_priority(vfs_handle_struct *handle)
 
 static int audit_connect(vfs_handle_struct *handle, const char *svc, const 
char *user)
 {
-       int result;
+       int result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
+
+       if (result < 0) {
+               return result;
+       }
 
        openlog("smbd_audit", LOG_PID, audit_syslog_facility(handle));
 
@@ -92,9 +96,7 @@ static int audit_connect(vfs_handle_struct *handle, const 
char *svc, const char
        DEBUG(10, ("Connected to service %s as user %s\n",
               svc, user));
 
-       result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
-
-       return result;
+       return 0;
 }
 
 static void audit_disconnect(vfs_handle_struct *handle)
diff --git a/source3/modules/vfs_fileid.c b/source3/modules/vfs_fileid.c
index 133ad09..559b520 100644
--- a/source3/modules/vfs_fileid.c
+++ b/source3/modules/vfs_fileid.c
@@ -181,9 +181,15 @@ static int fileid_connect(struct vfs_handle_struct *handle,
 {
        struct fileid_handle_data *data;
        const char *algorithm;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
 
        data = talloc_zero(handle->conn, struct fileid_handle_data);
        if (!data) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0, ("talloc_zero() failed\n"));
                return -1;
        }
@@ -203,6 +209,7 @@ static int fileid_connect(struct vfs_handle_struct *handle,
        } else if (strcmp("fsid", algorithm) == 0) {
                data->device_mapping_fn = fileid_device_mapping_fsid;
        } else {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0,("fileid_connect(): unknown algorithm[%s]\n", 
algorithm));
                return -1;
        }
@@ -214,7 +221,7 @@ static int fileid_connect(struct vfs_handle_struct *handle,
        DEBUG(10, ("fileid_connect(): connect to service[%s] with 
algorithm[%s]\n",
                service, algorithm));
 
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 static void fileid_disconnect(struct vfs_handle_struct *handle)
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index d9d12a1..19ac7ad 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -606,12 +606,14 @@ static int smb_full_audit_connect(vfs_handle_struct 
*handle,
        const char *none[] = { NULL };
        const char *all [] = { "all" };
 
-       if (!handle) {
-               return -1;
+       result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
+       if (result < 0) {
+               return result;
        }
 
        pd = SMB_MALLOC_P(struct vfs_full_audit_private_data);
        if (!pd) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                return -1;
        }
        ZERO_STRUCTP(pd);
@@ -631,12 +633,10 @@ static int smb_full_audit_connect(vfs_handle_struct 
*handle,
        SMB_VFS_HANDLE_SET_DATA(handle, pd, free_private_data,
                                struct vfs_full_audit_private_data, return -1);
 
-       result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
-
        do_log(SMB_VFS_OP_CONNECT, True, handle,
               "%s", svc);
 
-       return result;
+       return 0;
 }
 
 static void smb_full_audit_disconnect(vfs_handle_struct *handle)
diff --git a/source3/modules/vfs_onefs.c b/source3/modules/vfs_onefs.c
index 865eccd..5f1b992 100644
--- a/source3/modules/vfs_onefs.c
+++ b/source3/modules/vfs_onefs.c
@@ -28,15 +28,20 @@
 static int onefs_connect(struct vfs_handle_struct *handle, const char *service,
                         const char *user)
 {
-       int ret;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
 
        ret = onefs_load_config(handle->conn);
        if (ret) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(3, ("Load config failed: %s\n", strerror(errno)));
                return ret;
        }
 
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 static int onefs_mkdir(vfs_handle_struct *handle, const char *path,
diff --git a/source3/modules/vfs_prealloc.c b/source3/modules/vfs_prealloc.c
index c6333be..386de29 100644
--- a/source3/modules/vfs_prealloc.c
+++ b/source3/modules/vfs_prealloc.c
@@ -101,10 +101,16 @@ static int prealloc_connect(
                 const char *                service,
                 const char *                user)
 {
-           module_debug = lp_parm_int(SNUM(handle->conn),
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+
+       module_debug = lp_parm_int(SNUM(handle->conn),
                                        MODULE, "debug", 100);
 
-           return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 static int prealloc_open(vfs_handle_struct* handle,
diff --git a/source3/modules/vfs_readahead.c b/source3/modules/vfs_readahead.c
index 1242308..e7a7dd3 100644
--- a/source3/modules/vfs_readahead.c
+++ b/source3/modules/vfs_readahead.c
@@ -127,8 +127,15 @@ static int readahead_connect(struct vfs_handle_struct 
*handle,
                                const char *service,
                                const char *user)
 {
-       struct readahead_data *rhd = SMB_MALLOC_P(struct readahead_data);
+       struct readahead_data *rhd;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+       rhd = SMB_MALLOC_P(struct readahead_data);
        if (!rhd) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0,("readahead_connect: out of memory\n"));
                return -1;
        }
@@ -152,7 +159,7 @@ static int readahead_connect(struct vfs_handle_struct 
*handle,
 
        handle->data = (void *)rhd;
        handle->free_data = free_readahead_data;
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 static struct vfs_fn_pointers vfs_readahead_fns = {
diff --git a/source3/modules/vfs_readonly.c b/source3/modules/vfs_readonly.c
index f736028..afb167f 100644
--- a/source3/modules/vfs_readonly.c
+++ b/source3/modules/vfs_readonly.c
@@ -62,6 +62,11 @@ static int readonly_connect(vfs_handle_struct *handle,
   const char **period = lp_parm_string_list(SNUM(handle->conn),
                                             (handle->param ? handle->param : 
MODULE_NAME),
                                             "period", period_def); 
+  int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+  if (ret < 0) {
+    return ret;
+  }
 
   if (period && period[0] && period[1]) {
     int i;
@@ -85,11 +90,11 @@ static int readonly_connect(vfs_handle_struct *handle,
       conn->vuid_cache.next_entry = 0;
     }
 
-    return SMB_VFS_NEXT_CONNECT(handle, service, user);
+    return 0;
 
   } else {
     
-    return 1;
+    return 0;
     
   }
 }
diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c
index 0c019db..6674427 100644
--- a/source3/modules/vfs_recycle.c
+++ b/source3/modules/vfs_recycle.c
@@ -38,10 +38,16 @@ static int recycle_unlink(vfs_handle_struct *handle,
 
 static int recycle_connect(vfs_handle_struct *handle, const char *service, 
const char *user)
 {
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+
        DEBUG(10,("recycle_connect() connect to service[%s] as user[%s].\n",
                service,user));
 
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 static void recycle_disconnect(vfs_handle_struct *handle)
diff --git a/source3/modules/vfs_smb_traffic_analyzer.c 
b/source3/modules/vfs_smb_traffic_analyzer.c
index 08389f5..1eb02a2 100644
--- a/source3/modules/vfs_smb_traffic_analyzer.c
+++ b/source3/modules/vfs_smb_traffic_analyzer.c
@@ -277,6 +277,11 @@ static int smb_traffic_analyzer_connect(struct 
vfs_handle_struct *handle,
        uint16_t port = (st == UNIX_DOMAIN_SOCKET) ? 0 :
                                atoi( lp_parm_const_string(SNUM(conn),
                                "smb_traffic_analyzer", "port", "9430"));
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
 
        /* Are we already connected ? */
        for (rf_sock = sock_list; rf_sock; rf_sock = rf_sock->next) {
@@ -294,11 +299,13 @@ static int smb_traffic_analyzer_connect(struct 
vfs_handle_struct *handle,
                /* New connection. */
                rf_sock = TALLOC_ZERO_P(NULL, struct refcounted_sock);
                if (rf_sock == NULL) {
+                       SMB_VFS_NEXT_DISCONNECT(handle);
                        errno = ENOMEM;
                        return -1;
                }
                rf_sock->name = talloc_strdup(rf_sock, name);
                if (rf_sock->name == NULL) {
+                       SMB_VFS_NEXT_DISCONNECT(handle);
                        TALLOC_FREE(rf_sock);
                        errno = ENOMEM;
                        return -1;
@@ -316,6 +323,7 @@ static int smb_traffic_analyzer_connect(struct 
vfs_handle_struct *handle,
                                                        port);
                }
                if (rf_sock->sock == -1) {
+                       SMB_VFS_NEXT_DISCONNECT(handle);
                        TALLOC_FREE(rf_sock);
                        return -1;
                }
@@ -325,7 +333,7 @@ static int smb_traffic_analyzer_connect(struct 
vfs_handle_struct *handle,
        /* Store the private data. */
        SMB_VFS_HANDLE_SET_DATA(handle, rf_sock, smb_traffic_analyzer_free_data,
                                struct refcounted_sock, return -1);
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
 /* VFS Functions: write, read, pread, pwrite for now */
diff --git a/source3/modules/vfs_tsmsm.c b/source3/modules/vfs_tsmsm.c
index 7c63b8c..12f79ff 100644
--- a/source3/modules/vfs_tsmsm.c
+++ b/source3/modules/vfs_tsmsm.c
@@ -87,16 +87,24 @@ static void tsmsm_free_data(void **pptr) {
 static int tsmsm_connect(struct vfs_handle_struct *handle,
                         const char *service,
                         const char *user) {
-       struct tsmsm_struct *tsmd = TALLOC_ZERO_P(handle, struct tsmsm_struct);
+       struct tsmsm_struct *tsmd;
        const char *fres;
        const char *tsmname;
-       
+        int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+
+       tsmd = TALLOC_ZERO_P(handle, struct tsmsm_struct);
        if (!tsmd) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0,("tsmsm_connect: out of memory!\n"));
                return -1;
        }
 
        if (!dmapi_have_session()) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0,("tsmsm_connect: no DMAPI session for Samba is 
available!\n"));
                TALLOC_FREE(tsmd);
                return -1;
@@ -134,7 +142,7 @@ static int tsmsm_connect(struct vfs_handle_struct *handle,
         /* Store the private data. */
         SMB_VFS_HANDLE_SET_DATA(handle, tsmd, tsmsm_free_data,
                                 struct tsmsm_struct, return -1);
-        return SMB_VFS_NEXT_CONNECT(handle, service, user); 
+        return 0;
 }
 
 static bool tsmsm_is_offline(struct vfs_handle_struct *handle, 


-- 
Samba Shared Repository

Reply via email to