diff options
author | Jeremy Allison <jra@samba.org> | 2006-01-27 19:54:39 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:06:16 -0500 |
commit | 6a097ab20ea54a7b090ad6e62c1538d5e5997f31 (patch) | |
tree | 92032a3036b7374968b431658d53e68b47da0e69 /source3 | |
parent | 139acd247060841b44079f1703af0e71109ba74e (diff) | |
download | samba-6a097ab20ea54a7b090ad6e62c1538d5e5997f31.tar.gz samba-6a097ab20ea54a7b090ad6e62c1538d5e5997f31.tar.bz2 samba-6a097ab20ea54a7b090ad6e62c1538d5e5997f31.zip |
r13192: Fix up alignment issues when printing share mode
entries. Add paranioa to debug so we know when an
entry is unused.
Jeremy.
(This used to be commit fa5fab313e3728ff49c00ca1097242039506f83e)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/locking/locking.c | 12 | ||||
-rw-r--r-- | source3/smbd/oplock.c | 9 |
2 files changed, 17 insertions, 4 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 9a13e099db..770ef918b8 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -384,11 +384,13 @@ char *share_mode_str(int num, struct share_mode_entry *e) { static pstring share_str; - slprintf(share_str, sizeof(share_str)-1, "share_mode_entry[%d]: " + slprintf(share_str, sizeof(share_str)-1, "share_mode_entry[%d]: %s " "pid = %s, share_access = 0x%x, private_options = 0x%x, " "access_mask = 0x%x, mid = 0x%x, type= 0x%x, file_id = %lu, " "dev = 0x%x, inode = %.0f", - num, procid_str_static(&e->pid), + num, + e->op_type == UNUSED_SHARE_MODE_ENTRY ? "UNUSED" : "", + procid_str_static(&e->pid), e->share_access, e->private_options, e->access_mask, e->op_mid, e->op_type, e->share_file_id, (unsigned int)e->dev, (double)e->inode ); @@ -408,9 +410,11 @@ static void print_share_mode_table(struct locking_data *data) int i; for (i = 0; i < num_share_modes; i++) { - struct share_mode_entry *entry_p = &shares[i]; + struct share_mode_entry entry; + + memcpy(&entry, &shares[i], sizeof(struct share_mode_entry)); DEBUG(10,("print_share_mode_table: %s\n", - share_mode_str(i, entry_p))); + share_mode_str(i, &entry))); } } diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 6739d29470..234b62e8ae 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -684,6 +684,11 @@ void release_level_2_oplocks_on_change(files_struct *fsp) don't have to do anything */ for (i=0; i<lck->num_share_modes; i++) { struct share_mode_entry *e = &lck->share_modes[i]; + + if (!is_valid_share_mode_entry(e)) { + continue; + } + if ((e->op_type == NO_OPLOCK) && (e->share_file_id == fsp->file_id) && (e->dev == fsp->dev) && @@ -701,6 +706,10 @@ void release_level_2_oplocks_on_change(files_struct *fsp) struct share_mode_entry *share_entry = &lck->share_modes[i]; char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE]; + if (!is_valid_share_mode_entry(share_entry)) { + continue; + } + /* * As there could have been multiple writes waiting at the * lock_share_entry gate we may not be the first to |