r1117: Doh ! Remember to turn off signing when sending a "break to level II" oplock
authorJeremy Allison <jra@samba.org>
Fri, 11 Jun 2004 23:54:52 +0000 (23:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:51:56 +0000 (10:51 -0500)
message, or we mess up the signing sequence number.... Also improve sign error
reporting. Also when deferring an open that had been deferred due to an oplock
break, don't re-add the mid to the pending sign queue or we increment the sequence
number twice and mess up signing again...
I can now bounce between 2 WinXP/Win2003 boxes opening Excel spreadsheets with
signing turned on and get correct "file in use" messages.
Jeremy.

source/libsmb/smb_signing.c
source/smbd/oplock.c

index 63838e6933e68d44d48a08531877e322125020e1..868c991c169283fa2311db7231fd3e4a075be112 100644 (file)
@@ -42,11 +42,18 @@ struct smb_basic_signing_context {
        struct outstanding_packet_lookup *outstanding_packet_list;
 };
 
-static void store_sequence_for_reply(struct outstanding_packet_lookup **list, 
+static BOOL store_sequence_for_reply(struct outstanding_packet_lookup **list, 
                                     uint16 mid, uint32 reply_seq_num)
 {
        struct outstanding_packet_lookup *t;
 
+       /* Ensure we only add a mid once. */
+       for (t = *list; t; t = t->next) {
+               if (t->mid == mid) {
+                       return False;
+               }
+       }
+
        t = smb_xmalloc(sizeof(*t));
        ZERO_STRUCTP(t);
 
@@ -65,6 +72,7 @@ static void store_sequence_for_reply(struct outstanding_packet_lookup **list,
        DLIST_ADD(*list, t);
        DEBUG(10,("store_sequence_for_reply: stored seq = %u mid = %u\n",
                        (unsigned int)reply_seq_num, (unsigned int)mid ));
+       return True;
 }
 
 static BOOL get_sequence_for_reply(struct outstanding_packet_lookup **list,
@@ -748,14 +756,16 @@ static BOOL srv_check_incoming_message(char *inbuf, struct smb_sign_info *si, BO
        
        if (!good) {
 
-               DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u wanted SMB signature of\n",
-                                       (unsigned int)saved_seq));
-               dump_data(5, (const char *)calc_md5_mac, 8);
-               
-               DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u got SMB signature of\n",
+               if (saved_seq) {
+                       DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u wanted SMB signature of\n",
                                        (unsigned int)saved_seq));
-               dump_data(5, (const char *)server_sent_mac, 8);
+                       dump_data(5, (const char *)calc_md5_mac, 8);
 
+                       DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u got SMB signature of\n",
+                                               (unsigned int)reply_seq_number));
+                       dump_data(5, (const char *)server_sent_mac, 8);
+               }
+               
 #if 1 /* JRATEST */
                {
                        int i;
@@ -848,9 +858,13 @@ void srv_defer_sign_response(uint16 mid)
        if (!data)
                return;
 
-       store_sequence_for_reply(&data->outstanding_packet_list, 
-                                mid, data->send_seq_num);
-       data->send_seq_num++;
+       /*
+        * Ensure we only store this mid reply once...
+        */
+
+       if (store_sequence_for_reply(&data->outstanding_packet_list, mid, data->send_seq_num)) {
+               data->send_seq_num++;
+       }
 }
 
 /***********************************************************
index c34fa609542e493254173462f5add32ba2b7988a..1ffc798b1fc388fb4865456a0b90f2e6953d04c5 100644 (file)
@@ -616,6 +616,8 @@ BOOL oplock_break_level2(files_struct *fsp, BOOL local_request, int token)
         */
 
        if (global_client_caps & CAP_LEVEL_II_OPLOCKS) {
+               BOOL sign_state;
+
                /*
                 * If we are sending an oplock break due to an SMB sent
                 * by our own client we ensure that we wait at leat
@@ -627,10 +629,16 @@ BOOL oplock_break_level2(files_struct *fsp, BOOL local_request, int token)
                wait_before_sending_break(local_request);
 
                /* Prepare the SMBlockingX message. */
-
                prepare_break_message( outbuf, fsp, False);
+
+               /* Save the server smb signing state. */
+               sign_state = srv_oplock_set_signing(False);
+
                if (!send_smb(smbd_server_fd(), outbuf))
                        exit_server("oplock_break_level2: send_smb failed.");
+
+               /* Restore the sign state to what it was. */
+               srv_oplock_set_signing(sign_state);
        }
 
        /*