diff options
author | Tim Potter <tpot@samba.org> | 2003-07-14 04:46:48 +0000 |
---|---|---|
committer | Tim Potter <tpot@samba.org> | 2003-07-14 04:46:48 +0000 |
commit | 860d64e038ccc173ec19811f2da90363c078b000 (patch) | |
tree | 5cdfb57b2934ea43e092c8b04f6880a28482854d /packet-dcerpc-spoolss.c | |
parent | e146533cfd8e65cbc3a867954bce5a06d4ec1766 (diff) |
Fix misdissection of spoolss enumprinterdataex replies:
- skip dissection of value if value length is zero
- add placeholder for REG_MULTI_SZ value proto item
- rename local variable start to start_offset for consistency
svn path=/trunk/; revision=8019
Diffstat (limited to 'packet-dcerpc-spoolss.c')
-rw-r--r-- | packet-dcerpc-spoolss.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/packet-dcerpc-spoolss.c b/packet-dcerpc-spoolss.c index 6e18e1c822..d143f23597 100644 --- a/packet-dcerpc-spoolss.c +++ b/packet-dcerpc-spoolss.c @@ -2,7 +2,7 @@ * Routines for SMB \PIPE\spoolss packet disassembly * Copyright 2001-2003, Tim Potter <tpot@samba.org> * - * $Id: packet-dcerpc-spoolss.c,v 1.102 2003/06/26 04:30:29 tpot Exp $ + * $Id: packet-dcerpc-spoolss.c,v 1.103 2003/07/14 04:46:48 tpot Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -6302,7 +6302,7 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep) { - guint32 start = offset; + guint32 start_offset = offset; guint32 name_offset, name_len, val_offset, val_len, val_type; char *name; proto_item *item; @@ -6319,7 +6319,7 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, hf_enumprinterdataex_name_len, &name_len); dissect_spoolss_uint16uni( - tvb, start + name_offset, pinfo, NULL, drep, + tvb, start_offset + name_offset, pinfo, NULL, drep, &name, "Name"); item = proto_tree_add_text(tree, tvb, offset, 0, "Name: "); @@ -6335,7 +6335,7 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, subtree, tvb, offset - 4, 4, "Name len: %d", name_len); proto_tree_add_text( - subtree, tvb, start + name_offset, (strlen(name) + 1) * 2, + subtree, tvb, start_offset + name_offset, (strlen(name) + 1) * 2, "Name: %s", name); offset = dissect_ndr_uint32( @@ -6350,11 +6350,17 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, tvb, offset, pinfo, subtree, drep, hf_enumprinterdataex_val_len, &val_len); + if (val_len == 0) { + proto_tree_add_text(subtree, tvb, start_offset + val_offset, 4, + "Value: (null)"); + goto done; + } + switch(val_type) { case DCERPC_REG_DWORD: { guint32 value; guint16 low, high; - int offset2 = offset + val_offset; + int offset2 = start_offset + val_offset; /* Needs to be broken into two 16-byte ints because it may not be aligned. */ @@ -6369,7 +6375,7 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, value = (high << 16) | low; - proto_tree_add_text(subtree, tvb, start + val_offset, 4, + proto_tree_add_text(subtree, tvb, start_offset + val_offset, 4, "Value: %d", value); proto_item_append_text(item, ", Value: %d", value); @@ -6380,7 +6386,7 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, char *value; dissect_spoolss_uint16uni( - tvb, start + val_offset, pinfo, subtree, drep, + tvb, start_offset + val_offset, pinfo, subtree, drep, &value, "Value"); proto_item_append_text(item, ", Value: %s", value); @@ -6393,15 +6399,27 @@ dissect_spoolss_printer_enum_values(tvbuff_t *tvb, int offset, /* FIXME: nicer way to display this */ - proto_tree_add_text(subtree, tvb, start + val_offset, val_len, - "Value: <binary data>"); + proto_tree_add_text( + subtree, tvb, start_offset + val_offset, val_len, + "Value: <binary data>"); + break; + + case DCERPC_REG_MULTI_SZ: + + /* FIXME: implement REG_MULTI_SZ support */ + + proto_tree_add_text( + subtree, tvb, start_offset + val_offset, val_len, + "Value: <REG_MULTI_SZ not implemented>"); break; default: - proto_tree_add_text(subtree, tvb, start + val_offset, val_len, - "%s: unknown type %d", name, val_type); + proto_tree_add_text( + subtree, tvb, start_offset + val_offset, val_len, + "%s: unknown type %d", name, val_type); } + done: g_free(name); return offset; |