diff options
-rw-r--r-- | source3/include/smb.h | 25 | ||||
-rw-r--r-- | source3/libsmb/smb_share_modes.c | 38 | ||||
-rw-r--r-- | source3/locking/locking.c | 18 |
3 files changed, 48 insertions, 33 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index b167e4ee12..dc03ba44d4 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -670,6 +670,31 @@ struct share_mode_lock { BOOL modified; }; +/* + * Internal structure of locking.tdb share mode db. + * Used by locking.c and libsmbsharemodes.c + */ + +struct locking_data { + union { + struct { + int num_share_mode_entries; + BOOL delete_on_close; + BOOL initial_delete_on_close; /* Only set at NTCreateX if file was created. */ + uint32 delete_token_size; /* Only valid if either of + the two previous fields + are True. */ + } s; + struct share_mode_entry dummy; /* Needed for alignment. */ + } u; + /* The following four entries are implicit + struct share_mode_entry modes[num_share_mode_entries]; + char unix_token[delete_token_size] (divisible by 4). + char share_name[]; + char file_name[]; + */ +}; + #define NT_HASH_LEN 16 #define LM_HASH_LEN 16 diff --git a/source3/libsmb/smb_share_modes.c b/source3/libsmb/smb_share_modes.c index 86071ee2e9..f7e7baf445 100644 --- a/source3/libsmb/smb_share_modes.c +++ b/source3/libsmb/smb_share_modes.c @@ -2,7 +2,7 @@ Samba share mode database library external interface library. Used by non-Samba products needing access to the Samba share mode db. - Copyright (C) Jeremy Allison 2005. + Copyright (C) Jeremy Allison 2005 - 2006 sharemodes_procid functions (C) Copyright (C) Volker Lendecke 2005 @@ -25,6 +25,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* + * Version 2 - interface changed to handle the token added for correct + * delete on close semantics. + */ + #include "includes.h" #include "smb_share_modes.h" @@ -115,9 +120,7 @@ int smb_unlock_share_mode_entry(struct smbdb_ctx *db_ctx, return tdb_chainunlock(db_ctx->smb_tdb, get_locking_key(dev, ino)); } -/* Internal structure of Samba share mode db. */ -/* FIXME ! This should be moved into a Samba include file. */ - +#if 0 struct locking_data { union { struct { @@ -132,12 +135,14 @@ struct locking_data { char file_name[]; */ }; +#endif /* * Check if an external smb_share_mode_entry and an internal share_mode entry match. */ -static int share_mode_entry_equal(const struct smb_share_mode_entry *e_entry, const struct share_mode_entry *entry) +static int share_mode_entry_equal(const struct smb_share_mode_entry *e_entry, + const struct share_mode_entry *entry) { return (sharemodes_procid_equal(&e_entry->pid, &entry->pid) && e_entry->file_id == (uint32_t)entry->share_file_id && @@ -153,7 +158,8 @@ static int share_mode_entry_equal(const struct smb_share_mode_entry *e_entry, co * Create an internal Samba share_mode entry from an external smb_share_mode_entry. */ -static void create_share_mode_entry(struct share_mode_entry *out, const struct smb_share_mode_entry *in) +static void create_share_mode_entry(struct share_mode_entry *out, + const struct smb_share_mode_entry *in) { memset(out, '\0', sizeof(struct share_mode_entry)); @@ -281,9 +287,11 @@ int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx, return -1; } ld = (struct locking_data *)db_data.dptr; + memset(ld, '\0', sizeof(struct locking_data)); ld->u.s.num_share_mode_entries = 1; ld->u.s.delete_on_close = 0; ld->u.s.initial_delete_on_close = 0; + ld->u.s.delete_token_size = 0; shares = (struct share_mode_entry *)(db_data.dptr + sizeof(struct share_mode_entry)); create_share_mode_entry(shares, new_entry); @@ -328,7 +336,7 @@ int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx, ld = (struct locking_data *)new_data_p; ld->u.s.num_share_mode_entries++; - /* Append the original filename */ + /* Append the original delete_token and filenames. */ memcpy(new_data_p + ((ld->u.s.num_share_mode_entries+1)*sizeof(struct share_mode_entry)), db_data.dptr + ((orig_num_share_modes+1)*sizeof(struct share_mode_entry)), db_data.dsize - ((orig_num_share_modes+1) * sizeof(struct share_mode_entry))); @@ -378,9 +386,9 @@ int smb_delete_share_mode_entry(struct smbdb_ctx *db_ctx, struct locking_data *ld = NULL; /* internal samba db state. */ struct share_mode_entry *shares = NULL; char *new_data_p = NULL; - size_t filename_size = 0; + size_t remaining_size = 0; size_t i, num_share_modes; - const char *fname_ptr = NULL; + const char *remaining_ptr = NULL; db_data = tdb_fetch(db_ctx->smb_tdb, locking_key); if (!db_data.dptr) { @@ -440,13 +448,13 @@ int smb_delete_share_mode_entry(struct smbdb_ctx *db_ctx, return tdb_delete(db_ctx->smb_tdb, locking_key); } - /* Copy the terminating filename. */ - fname_ptr = db_data.dptr + ((orig_num_share_modes+1) * sizeof(struct share_mode_entry)); - filename_size = db_data.dsize - (fname_ptr - db_data.dptr); + /* Copy any delete token plus the terminating filenames. */ + remaining_ptr = db_data.dptr + ((orig_num_share_modes+1) * sizeof(struct share_mode_entry)); + remaining_size = db_data.dsize - (remaining_ptr - db_data.dptr); memcpy(new_data_p + ((num_share_modes+1)*sizeof(struct share_mode_entry)), - fname_ptr, - filename_size); + remaining_ptr, + remaining_size); free(db_data.dptr); @@ -456,7 +464,7 @@ int smb_delete_share_mode_entry(struct smbdb_ctx *db_ctx, ld = (struct locking_data *)db_data.dptr; ld->u.s.num_share_mode_entries = num_share_modes; - db_data.dsize = ((num_share_modes+1)*sizeof(struct share_mode_entry)) + filename_size; + db_data.dsize = ((num_share_modes+1)*sizeof(struct share_mode_entry)) + remaining_size; if (tdb_store(db_ctx->smb_tdb, locking_key, db_data, TDB_REPLACE) == -1) { free(db_data.dptr); diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 666988b541..9a707f80a4 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -44,24 +44,6 @@ uint16 global_smbpid; /* the locking database handle */ static TDB_CONTEXT *tdb; -struct locking_data { - union { - struct { - int num_share_mode_entries; - BOOL delete_on_close; - BOOL initial_delete_on_close; /* Only set at NTCreateX if file was created. */ - uint32 delete_token_size; /* Only valid if either of - the two previous fields - are True. */ - } s; - struct share_mode_entry dummy; /* Needed for alignment. */ - } u; - /* the following two entries are implicit - struct share_mode_entry modes[num_share_mode_entries]; - char file_name[]; - */ -}; - /**************************************************************************** Debugging aid :-). ****************************************************************************/ |