svn commit: samba r5405 - in branches/SAMBA_4_0/source/libcli/nbt: .

tridge at samba.org tridge at samba.org
Tue Feb 15 05:39:12 GMT 2005


Author: tridge
Date: 2005-02-15 05:39:12 +0000 (Tue, 15 Feb 2005)
New Revision: 5405

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5405

Log:
try to use NBT name pointers when a netbios name is repeated in a NBT
packet. This allows much longer names to fit within the limits of NBT
name packets (rfc1002.txt also says this should be done, although
Samba3 never generates them).

The main reason for doing this is it means that our NBT name pointer 
decoding code is tested with the smbtorture tests

Modified:
   branches/SAMBA_4_0/source/libcli/nbt/nbtname.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/nbt/nbtname.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/nbt/nbtname.c	2005-02-15 05:14:09 UTC (rev 5404)
+++ branches/SAMBA_4_0/source/libcli/nbt/nbtname.c	2005-02-15 05:39:12 UTC (rev 5405)
@@ -214,8 +214,9 @@
 	uint_t num_components;
 	uint8_t *components[MAX_COMPONENTS];
 	char *dscope=NULL, *p;
-	uint8_t *cname;
+	uint8_t *cname, *fullname;
 	int i;
+	int fulllen;
 
 	if (!(ndr_flags & NDR_SCALARS)) {
 		return NT_STATUS_OK;
@@ -246,15 +247,32 @@
 	if (num_components == MAX_COMPONENTS) {
 		return NT_STATUS_BAD_NETWORK_NAME;
 	}
+
+	fullname = talloc_asprintf(ndr, "%c%s", (unsigned char)strlen(cname), cname);
+	NT_STATUS_HAVE_NO_MEMORY(fullname);
 		
-	/* push the components */
-	for (i=0;i<num_components;i++) {
-		uint8_t len = strlen(components[i]);
-		NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, len));
-		NDR_CHECK(ndr_push_bytes(ndr, components[i], len));
+	for (i=1;i<num_components;i++) {
+		fullname = talloc_asprintf_append(fullname, "%c%s", 
+						  (unsigned char)strlen(components[i]), components[i]);
+		NT_STATUS_HAVE_NO_MEMORY(fullname);
 	}
-	NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, 0));
 
+	/* see if we can find the fullname in the existing packet - if
+	   so, we can use a NBT name pointer. This allows us to fit
+	   longer names into the packet */
+	fulllen = strlen(fullname)+1;
+	for (i=0;i + fulllen < ndr->offset;i++) {
+		if (ndr->data[i] == fullname[0] &&
+		    memcmp(fullname, &ndr->data[i], fulllen) == 0) {
+			talloc_free(fullname);
+			return ndr_push_uint16(ndr, NDR_SCALARS, 0xC000 | i);
+		}
+	}
+
+	NDR_CHECK(ndr_push_bytes(ndr, fullname, fulllen));
+
+	talloc_free(fullname);
+
 	return NT_STATUS_OK;
 }
 



More information about the samba-cvs mailing list