summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-01-27 19:54:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:06:16 -0500
commit6a097ab20ea54a7b090ad6e62c1538d5e5997f31 (patch)
tree92032a3036b7374968b431658d53e68b47da0e69 /source3
parent139acd247060841b44079f1703af0e71109ba74e (diff)
downloadsamba-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.c12
-rw-r--r--source3/smbd/oplock.c9
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