From 93cd3e9022c75f026f6d0bf3a2719df662d32db1 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 15 Feb 2005 05:39:12 +0000 Subject: r5405: 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 (This used to be commit 6e2feef125daceb143c44c0c4ab73b010b311792) --- source4/libcli/nbt/nbtname.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'source4/libcli/nbt') diff --git a/source4/libcli/nbt/nbtname.c b/source4/libcli/nbt/nbtname.c index bf545a6374..12b8884e2d 100644 --- a/source4/libcli/nbt/nbtname.c +++ b/source4/libcli/nbt/nbtname.c @@ -214,8 +214,9 @@ NTSTATUS ndr_push_nbt_name(struct ndr_push *ndr, int ndr_flags, struct nbt_name 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,14 +247,31 @@ NTSTATUS ndr_push_nbt_name(struct ndr_push *ndr, int ndr_flags, struct nbt_name 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;ioffset;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; } -- cgit