aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Sharpe <sharpe@ns.aus.com>2005-11-28 17:32:30 +0000
committerRichard Sharpe <sharpe@ns.aus.com>2005-11-28 17:32:30 +0000
commit3e92ea7c1f0ac4b2b822d9c2d7f02fcac3510beb (patch)
treea03c041a2f27f4c933e19a112a4f620bfeffec5e
parent4e4c2942e728daa807c2fdb5041dd0afc0e100ca (diff)
Change the way we handle realloc so that we now compute all the space required
up front and realloc once ... This will probably be the last changes I make on this dissector, as I want to concentrate on using asn2eth for LDAP, as time permits. svn path=/trunk/; revision=16619
-rw-r--r--epan/dissectors/packet-ldap.c35
1 files changed, 11 insertions, 24 deletions
diff --git a/epan/dissectors/packet-ldap.c b/epan/dissectors/packet-ldap.c
index a5125f14b3..57e53e1f47 100644
--- a/epan/dissectors/packet-ldap.c
+++ b/epan/dissectors/packet-ldap.c
@@ -777,6 +777,7 @@ static int parse_filter_substrings(ASN1_SCK *a, char **filter, guint *filter_len
*/
static int parse_filter_extensibleMatch(ASN1_SCK *a, char **filter, guint *filter_length, guint byte_length)
{
+ static char *dnString = "dn";
int ret;
guint length;
char *filterp;
@@ -814,7 +815,7 @@ static int parse_filter_extensibleMatch(ASN1_SCK *a, char **filter, guint *filte
dnAttributes = FALSE;
end = a->offset + byte_length;
- while (a->offset < end) {
+ while ((guint)a->offset < end) {
/*
* Now, parse out each of those items
* There will be up to four of them.
@@ -882,36 +883,33 @@ static int parse_filter_extensibleMatch(ASN1_SCK *a, char **filter, guint *filte
}
/*
- * Now, fill in the filter string
+ * Now, fill in the filter string.
+ * First, calc how much space is needed and then realloc.
*/
- filterp = *filter + strlen(*filter);
*filter_length += 1; /* For the ( */
+ if (type) *filter_length += strlen(type) + 1;
+ if (dnAttributes) *filter_length += strlen(dnString) + 1;
+ if (matchingRule) *filter_length += strlen(matchingRule) + 1;
+ if (matchValue) *filter_length += strlen(matchValue) + 1;
+ *filter_length += 1; /* for the ) */
+
*filter = g_realloc(*filter, *filter_length);
+ filterp = *filter + strlen(*filter);
*filterp++ = '(';
- *filterp = '\0';
if (type) {
if (strlen(type) > 0) {
- *filter_length += 1 + strlen(type);
- *filter = g_realloc(*filter, *filter_length);
- filterp = *filter + strlen(*filter);
memcpy(filterp, type, strlen(type));
filterp += strlen(type);
*filterp++ = ':';
- *filterp = '\0';
/*
* Add in dn if needed ...
*/
if (dnAttributes) {
- static char *dnString = "dn";
- *filter_length += 1 + strlen(dnString);
- *filter = g_realloc(*filter, *filter_length);
- filterp = *filter + strlen(*filter);
memcpy(filterp, dnString, strlen(dnString));
filterp += strlen(dnString);
*filterp++ = ':';
- *filterp = '\0';
}
}
g_free(type);
@@ -919,32 +917,21 @@ static int parse_filter_extensibleMatch(ASN1_SCK *a, char **filter, guint *filte
if (matchingRule) {
if (strlen(matchingRule) > 0) {
- *filter_length += 1 + strlen(matchingRule);
- *filter = g_realloc(*filter, *filter_length);
- filterp = *filter + strlen(*filter);
memcpy(filterp, matchingRule, strlen(matchingRule));
filterp += strlen(matchingRule);
*filterp++ = ':';
- *filterp = '\0';
}
g_free(matchingRule);
}
if (matchValue) {
if (strlen(matchValue) > 0) {
- *filter_length += strlen(matchValue);
- *filter = g_realloc(*filter, *filter_length);
- filterp = *filter + strlen(*filter);
memcpy(filterp, matchValue, strlen(matchValue));
filterp += strlen(matchValue);
- *filterp = '\0';
}
g_free(matchValue);
}
- *filter_length +=1;
- *filter = g_realloc(*filter, *filter_length);
- filterp = *filter + strlen(*filter);
*filterp++ = ')';
*filterp = '\0'; /* There had better be space */