r13192: Fix up alignment issues when printing share mode
authorJeremy Allison <jra@samba.org>
Fri, 27 Jan 2006 19:54:39 +0000 (19:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:06:16 +0000 (11:06 -0500)
entries. Add paranioa to debug so we know when an
entry is unused.
Jeremy.
(This used to be commit fa5fab313e3728ff49c00ca1097242039506f83e)

source3/locking/locking.c
source3/smbd/oplock.c

index 9a13e099dbf973cf473c91b8064131b3b40d1faf..770ef918b899f4c8258223c76178453db44a53e9 100644 (file)
@@ -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)));
        }
 }
 
index 6739d29470b2b66838995817ee681f061a9b2eb5..234b62e8ae47713745de198cd5cede390166e350 100644 (file)
@@ -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