s4:smbcli:smb2: add a random GUID to the transport connection in smb2_transport_init()
authorMichael Adam <obnox@samba.org>
Wed, 22 Feb 2012 14:29:26 +0000 (15:29 +0100)
committerMichael Adam <obnox@samba.org>
Thu, 23 Feb 2012 02:23:57 +0000 (03:23 +0100)
This GUID is used in the smb2 negprot when max protocol is bigger than 0x0202.
According to section 2.2.3 of the MS-SMB2 document, the Client GUID filed in the
SMB2 negotiate request must be filled with a (non-zero) GUID if there are other
dialects than 0x0202 in the dialects field.

http://msdn.microsoft.com/en-us/library/cc246543%28v=prot.13%29.aspx

Apart from corresponding to the docs, this change makes some of our durable-open
tests (e.g reopen2 and open-oplock) _not_ hang when running against windows 8
preview (which might be still buggy).

Pair-Programmed-With: Gregor Beck <gbeck@sernet.de>

Autobuild-User: Michael Adam <obnox@samba.org>
Autobuild-Date: Thu Feb 23 03:23:57 CET 2012 on sn-devel-104

source4/libcli/smb2/transport.c

index 59d49f7845b1b981a338f7bef7900c4aaf25992d..14d1fc541e837322f348ec85e04ee5fbe6191f93 100644 (file)
@@ -30,6 +30,7 @@
 #include "lib/stream/packet.h"
 #include "../lib/util/dlinklist.h"
 #include "../libcli/smb/smbXcli_base.h"
+#include "librpc/ndr/libndr.h"
 
 /*
   destroy a transport
@@ -48,6 +49,7 @@ struct smb2_transport *smb2_transport_init(struct smbcli_socket *sock,
                                           struct smbcli_options *options)
 {
        struct smb2_transport *transport;
+       struct GUID client_guid;
 
        transport = talloc_zero(parent_ctx, struct smb2_transport);
        if (!transport) return NULL;
@@ -58,12 +60,14 @@ struct smb2_transport *smb2_transport_init(struct smbcli_socket *sock,
        TALLOC_FREE(sock->event.fde);
        TALLOC_FREE(sock->event.te);
 
+       client_guid = GUID_random();
+
        transport->conn = smbXcli_conn_create(transport,
                                              sock->sock->fd,
                                              sock->hostname,
                                              options->signing,
                                              0, /* smb1_capabilities */
-                                             NULL); /* client_guid */
+                                             &client_guid);
        if (transport->conn == NULL) {
                talloc_free(transport);
                return NULL;