The Samba-Bugzilla – Attachment 5533 Details for
Bug 7283
vfs_acl_tdb does not work as expected
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Fix for 3.5.2.
0001-Fix-bug-7283-vfs_acl_tdb-does-not-work-as-expected.patch (text/plain), 5.79 KB, created by
Jeremy Allison
on 2010-03-24 12:04:07 UTC
(
hide
)
Description:
Fix for 3.5.2.
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2010-03-24 12:04:07 UTC
Size:
5.79 KB
patch
obsolete
>From 9cb1e5c035e420dfa4ab3a171898d7720fece3dc Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Wed, 24 Mar 2010 10:02:18 -0700 >Subject: [PATCH] Fix bug #7283 - vfs_acl_tdb does not work as expected. > >both vfs_acl_common.c and vfs_acl_tdb.c were using the connection >handle, thus conflicted. Fix this. > >Jeremy. >--- > source3/modules/vfs_acl_tdb.c | 48 ++++++++++++----------------------------- > source3/smbd/posix_acls.c | 4 ++- > 2 files changed, 17 insertions(+), 35 deletions(-) > >diff --git a/source3/modules/vfs_acl_tdb.c b/source3/modules/vfs_acl_tdb.c >index bfed0eb..8da0d1e 100644 >--- a/source3/modules/vfs_acl_tdb.c >+++ b/source3/modules/vfs_acl_tdb.c >@@ -37,12 +37,11 @@ static struct db_context *acl_db; > Open acl_db if not already open, increment ref count. > *******************************************************************/ > >-static bool acl_tdb_init(struct db_context **pp_db) >+static bool acl_tdb_init(void) > { > char *dbname; > > if (acl_db) { >- *pp_db = acl_db; > ref_count++; > return true; > } >@@ -55,10 +54,10 @@ static bool acl_tdb_init(struct db_context **pp_db) > } > > become_root(); >- *pp_db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600); >+ acl_db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600); > unbecome_root(); > >- if (*pp_db == NULL) { >+ if (acl_db == NULL) { > #if defined(ENOTSUP) > errno = ENOTSUP; > #else >@@ -77,14 +76,12 @@ static bool acl_tdb_init(struct db_context **pp_db) > Lower ref count and close acl_db if zero. > *******************************************************************/ > >-static void free_acl_tdb_data(void **pptr) >+static void disconnect_acl_tdb(struct vfs_handle_struct *handle) > { >- struct db_context **pp_db = (struct db_context **)pptr; >- >+ SMB_VFS_NEXT_DISCONNECT(handle); > ref_count--; > if (ref_count == 0) { >- TALLOC_FREE(*pp_db); >- acl_db = NULL; >+ TALLOC_FREE(acl_db); > } > } > >@@ -146,13 +143,10 @@ static NTSTATUS get_acl_blob(TALLOC_CTX *ctx, > uint8 id_buf[16]; > TDB_DATA data; > struct file_id id; >- struct db_context *db; >+ struct db_context *db = acl_db; > NTSTATUS status = NT_STATUS_OK; > SMB_STRUCT_STAT sbuf; > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, >- return NT_STATUS_INTERNAL_DB_CORRUPTION); >- > ZERO_STRUCT(sbuf); > > if (fsp) { >@@ -204,16 +198,13 @@ static NTSTATUS store_acl_blob_fsp(vfs_handle_struct *handle, > uint8 id_buf[16]; > struct file_id id; > TDB_DATA data; >- struct db_context *db; >+ struct db_context *db = acl_db; > struct db_record *rec; > NTSTATUS status; > > DEBUG(10,("store_acl_blob_fsp: storing blob length %u on file %s\n", > (unsigned int)pblob->length, fsp_str_dbg(fsp))); > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, >- return NT_STATUS_INTERNAL_DB_CORRUPTION); >- > status = vfs_stat_fsp(fsp); > if (!NT_STATUS_IS_OK(status)) { > return status; >@@ -243,12 +234,10 @@ static int unlink_acl_tdb(vfs_handle_struct *handle, > const struct smb_filename *smb_fname) > { > struct smb_filename *smb_fname_tmp = NULL; >- struct db_context *db; >+ struct db_context *db = acl_db; > NTSTATUS status; > int ret = -1; > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, return -1); >- > status = copy_smb_filename(talloc_tos(), smb_fname, &smb_fname_tmp); > if (!NT_STATUS_IS_OK(status)) { > errno = map_errno_from_nt_status(status); >@@ -284,11 +273,9 @@ static int rmdir_acl_tdb(vfs_handle_struct *handle, const char *path) > { > > SMB_STRUCT_STAT sbuf; >- struct db_context *db; >+ struct db_context *db = acl_db; > int ret = -1; > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, return -1); >- > if (lp_posix_pathnames()) { > ret = vfs_lstat_smb_fname(handle->conn, path, &sbuf); > } else { >@@ -316,21 +303,17 @@ static int connect_acl_tdb(struct vfs_handle_struct *handle, > const char *service, > const char *user) > { >- struct db_context *db; > int ret = SMB_VFS_NEXT_CONNECT(handle, service, user); > > if (ret < 0) { > return ret; > } > >- if (!acl_tdb_init(&db)) { >+ if (!acl_tdb_init()) { > SMB_VFS_NEXT_DISCONNECT(handle); > return -1; > } > >- SMB_VFS_HANDLE_SET_DATA(handle, db, free_acl_tdb_data, >- struct db_context, return -1); >- > /* Ensure we have "inherit acls = yes" if we're > * using this module. */ > DEBUG(2,("connect_acl_tdb: setting 'inherit acls = true' " >@@ -352,11 +335,9 @@ static int sys_acl_set_file_tdb(vfs_handle_struct *handle, > SMB_ACL_T theacl) > { > SMB_STRUCT_STAT sbuf; >- struct db_context *db; >+ struct db_context *db = acl_db; > int ret = -1; > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, return -1); >- > if (lp_posix_pathnames()) { > ret = vfs_lstat_smb_fname(handle->conn, path, &sbuf); > } else { >@@ -387,12 +368,10 @@ static int sys_acl_set_fd_tdb(vfs_handle_struct *handle, > files_struct *fsp, > SMB_ACL_T theacl) > { >- struct db_context *db; >+ struct db_context *db = acl_db; > NTSTATUS status; > int ret; > >- SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context, return -1); >- > status = vfs_stat_fsp(fsp); > if (!NT_STATUS_IS_OK(status)) { > return -1; >@@ -411,6 +390,7 @@ static int sys_acl_set_fd_tdb(vfs_handle_struct *handle, > > static struct vfs_fn_pointers vfs_acl_tdb_fns = { > .connect_fn = connect_acl_tdb, >+ .disconnect = disconnect_acl_tdb, > .opendir = opendir_acl_common, > .mkdir = mkdir_acl_common, > .open = open_acl_common, >diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c >index 7342420..eac20d2 100644 >--- a/source3/smbd/posix_acls.c >+++ b/source3/smbd/posix_acls.c >@@ -2698,7 +2698,9 @@ static bool set_canon_ace_list(files_struct *fsp, > mode_t mask_perms = 0; > > /* Use the psbuf that was passed in. */ >- fsp->fsp_name->st = *psbuf; >+ if (psbuf != &fsp->fsp_name->st) { >+ fsp->fsp_name->st = *psbuf; >+ } > > #if defined(POSIX_ACL_NEEDS_MASK) > /* HP-UX always wants to have a mask (called "class" there). */ >-- >1.7.0.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Flags:
metze
:
review+
Actions:
View
Attachments on
bug 7283
:
5526
| 5533