Ethereal-users: Re: [ethereal-users] LDAP Dissector
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxxxxx>
Date: Wed, 23 Aug 2000 22:40:31 -0700
On Wed, Aug 23, 2000 at 03:59:33PM -0700, Guy Harris wrote: > Yes, I'll take a look at this; callers to > "asn1_octet_string_value_decode()" must not assume that what they get > back is a '\0'-terminated string (it's a counted string, and it's not > even necessarily a character string - the ASN.1 dissector doesn't know > whether it is, although its caller probably does), *and* must not assume > that it gets back a non-null pointer. The LDAP dissector is making both > of those assumptions in some places.... Here's a patch to "packet-ldap.c" to fix that; users with source and "patch" and compiler tools/necessary libraries can patch and rebuild, users without any of those will probably have to wait for the next release and the binary packages for that release.
Index: packet-ldap.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/packet-ldap.c,v
retrieving revision 1.15
diff -c -r1.15 packet-ldap.c
*** packet-ldap.c 2000/08/13 14:08:24 1.15
--- packet-ldap.c 2000/08/24 05:39:12
***************
*** 311,319 ****
{
guchar *string;
guchar *string2;
! gint string_length;
! gint string2_length;
guint string_bytes;
int ret;
ret = asn1_octet_string_decode(a, &string, &string_length, &string_bytes);
--- 311,320 ----
{
guchar *string;
guchar *string2;
! guint string_length;
! guint string2_length;
guint string_bytes;
+ char *filterp;
int ret;
ret = asn1_octet_string_decode(a, &string, &string_length, &string_bytes);
***************
*** 324,330 ****
return ret;
*filter_length += 2 + strlen(operation) + string_length + string2_length;
*filter = g_realloc(*filter, *filter_length);
! sprintf(*filter + strlen(*filter), "(%.*s%s%.*s)", string_length, string, operation, string2_length, string2);
g_free(string);
g_free(string2);
return ASN1_ERR_NOERROR;
--- 325,344 ----
return ret;
*filter_length += 2 + strlen(operation) + string_length + string2_length;
*filter = g_realloc(*filter, *filter_length);
! filterp = *filter + strlen(*filter);
! *filterp++ = '(';
! if (string_length != 0) {
! memcpy(filterp, string, string_length);
! filterp += string_length;
! }
! strcpy(filterp, operation);
! filterp += strlen(operation);
! if (string2_length != 0) {
! memcpy(filterp, string2, string2_length);
! filterp += string2_length;
! }
! *filterp++ = ')';
! *filterp = '\0';
g_free(string);
g_free(string2);
return ASN1_ERR_NOERROR;
***************
*** 334,341 ****
static int parse_filter_substrings(ASN1_SCK *a, char **filter, guint *filter_length)
{
guchar *end;
! guchar *string = NULL;
! gint string_length;
guint string_bytes;
guint seq_len;
guint header_bytes;
--- 348,356 ----
static int parse_filter_substrings(ASN1_SCK *a, char **filter, guint *filter_length)
{
guchar *end;
! guchar *string;
! char *filterp;
! guint string_length;
guint string_bytes;
guint seq_len;
guint header_bytes;
***************
*** 355,363 ****
if (ret != ASN1_ERR_NOERROR)
return ret;
! *filter_length += 2 + 1 + strlen(string);
*filter = g_realloc(*filter, *filter_length);
! sprintf(*filter + strlen(*filter), "(%.*s=", string_length, string);
g_free(string);
/* Now decode seq_len's worth of octet strings. */
--- 370,386 ----
if (ret != ASN1_ERR_NOERROR)
return ret;
! *filter_length += 2 + 1 + string_length;
*filter = g_realloc(*filter, *filter_length);
!
! filterp = *filter + strlen(*filter);
! *filterp++ = '(';
! if (string_length != 0) {
! memcpy(filterp, string, string_length);
! filterp += string_length;
! }
! *filterp++ = '=';
! *filterp = '\0';
g_free(string);
/* Now decode seq_len's worth of octet strings. */
***************
*** 384,402 ****
/* If we have an 'any' component with a string value, we need to append
* an extra asterisk before final component. */
! if ((tag == 1) && (string_length > 0))
any_valued = 1;
if ( (tag == 1) || ((tag == 2) && any_valued) )
(*filter_length)++;
! *filter_length += strlen(string);
*filter = g_realloc(*filter, *filter_length);
if ( (tag == 1) || ((tag == 2) && any_valued) )
! strcat(*filter, "*");
if (tag == 2)
any_valued = 0;
! sprintf(*filter + strlen(*filter), "%.*s", string_length, string);
g_free(string);
}
--- 407,430 ----
/* If we have an 'any' component with a string value, we need to append
* an extra asterisk before final component. */
! if ((tag == 1) && (string_length != 0))
any_valued = 1;
if ( (tag == 1) || ((tag == 2) && any_valued) )
(*filter_length)++;
! *filter_length += string_length;
*filter = g_realloc(*filter, *filter_length);
+ filterp = *filter + strlen(*filter);
if ( (tag == 1) || ((tag == 2) && any_valued) )
! *filterp++ = '*';
if (tag == 2)
any_valued = 0;
! if (string_length != 0) {
! memcpy(filterp, string, string_length);
! filterp += string_length;
! }
! *filterp = '\0';
g_free(string);
}
***************
*** 404,414 ****
{
(*filter_length)++;
*filter = g_realloc(*filter, *filter_length);
! strcat(*filter, "*");
}
/* NB: Allocated byte for this earlier */
! strcat(*filter, ")");
return ASN1_ERR_NOERROR;
}
--- 432,444 ----
{
(*filter_length)++;
*filter = g_realloc(*filter, *filter_length);
! filterp = *filter + strlen(*filter);
! *filterp++ = '*';
}
/* NB: Allocated byte for this earlier */
! *filterp++ = ')';
! *filterp = '\0';
return ASN1_ERR_NOERROR;
}
***************
*** 519,524 ****
--- 549,555 ----
case LDAP_FILTER_PRESENT:
{
guchar *string;
+ char *filterp;
if (con != ASN1_PRI)
return ASN1_ERR_WRONG_TYPE;
***************
*** 527,533 ****
return ret;
*filter_length += 4 + length;
*filter = g_realloc(*filter, *filter_length);
! sprintf(*filter + strlen(*filter), "(%.*s=*)", (int)length, string);
g_free(string);
}
break;
--- 558,573 ----
return ret;
*filter_length += 4 + length;
*filter = g_realloc(*filter, *filter_length);
! filterp = *filter + strlen(*filter);
! *filterp++ = '(';
! if (length != 0) {
! memcpy(filterp, string, length);
! filterp += length;
! }
! *filterp++ = '=';
! *filterp++ = '*';
! *filterp++ = ')';
! *filterp = '\0';
g_free(string);
}
break;
- Follow-Ups:
- RE: [ethereal-users] LDAP Dissector
- From: Mark Symons
- RE: [ethereal-users] Win NT: Dialog Stays in Foreground
- From: Mark Symons
- RE: [ethereal-users] LDAP Dissector
- References:
- RE: [ethereal-users] LDAP Dissector
- From: Gilbert_Ramirez
- Re: [ethereal-users] LDAP Dissector
- From: Guy Harris
- RE: [ethereal-users] LDAP Dissector
- Prev by Date: Re: [ethereal-users] Support for GVRP
- Next by Date: [ethereal-users] Re: An updated version of the changes to fix "type of network is not supported"
- Previous by thread: Re: [ethereal-users] LDAP Dissector
- Next by thread: RE: [ethereal-users] LDAP Dissector
- Index(es):





