summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/libcli/ldap/ldap.c2
-rw-r--r--source4/libcli/util/asn1.c34
2 files changed, 24 insertions, 12 deletions
diff --git a/source4/libcli/ldap/ldap.c b/source4/libcli/ldap/ldap.c
index b7ae58f7f5..7af9ca42c5 100644
--- a/source4/libcli/ldap/ldap.c
+++ b/source4/libcli/ldap/ldap.c
@@ -602,7 +602,7 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result)
struct ldap_AbandonRequest *r = &msg->r.AbandonRequest;
asn1_push_tag(&data,
ASN1_APPLICATION_SIMPLE(LDAP_TAG_AbandonRequest));
- asn1_write_Integer(&data, r->messageid);
+ asn1_write_implicit_Integer(&data, r->messageid);
asn1_pop_tag(&data);
break;
}
diff --git a/source4/libcli/util/asn1.c b/source4/libcli/util/asn1.c
index b5db9b157e..ca62a0b574 100644
--- a/source4/libcli/util/asn1.c
+++ b/source4/libcli/util/asn1.c
@@ -110,13 +110,14 @@ BOOL asn1_pop_tag(ASN1_DATA *data)
/* "i" is the one's complement representation, as is the normal result of an
* implicit signed->unsigned conversion */
-static void push_int_bigendian(ASN1_DATA *data, unsigned int i, BOOL negative)
+static BOOL push_int_bigendian(ASN1_DATA *data, unsigned int i, BOOL negative)
{
uint8_t lowest = i & 0xFF;
i = i >> 8;
if (i != 0)
- push_int_bigendian(data, i, negative);
+ if (!push_int_bigendian(data, i, negative))
+ return False;
if (data->nesting->start+1 == data->ofs) {
@@ -126,40 +127,51 @@ static void push_int_bigendian(ASN1_DATA *data, unsigned int i, BOOL negative)
if (negative) {
/* Don't write leading 0xff's */
if (lowest == 0xFF)
- return;
+ return True;
if ((lowest & 0x80) == 0) {
/* The only exception for a leading 0xff is if
* the highest bit is 0, which would indicate
* a positive value */
- asn1_write_uint8(data, 0xff);
+ if (!asn1_write_uint8(data, 0xff))
+ return False;
}
} else {
if (lowest & 0x80) {
/* The highest bit of a positive integer is 1,
* this would indicate a negative number. Push
* a 0 to indicate a positive one */
- asn1_write_uint8(data, 0);
+ if (!asn1_write_uint8(data, 0))
+ return False;
}
}
}
- asn1_write_uint8(data, lowest);
+ return asn1_write_uint8(data, lowest);
}
-/* write an integer */
-BOOL asn1_write_Integer(ASN1_DATA *data, int i)
+/* write an Integer without the tag framing. Needed for example for the LDAP
+ * Abandon Operation */
+
+BOOL asn1_write_implicit_Integer(ASN1_DATA *data, int i)
{
- if (!asn1_push_tag(data, ASN1_INTEGER)) return False;
if (i == -1) {
/* -1 is special as it consists of all-0xff bytes. In
push_int_bigendian this is the only case that is not
properly handled, as all 0xff bytes would be handled as
leading ones to be ignored. */
- asn1_write_uint8(data, 0xff);
+ return asn1_write_uint8(data, 0xff);
} else {
- push_int_bigendian(data, i, i<0);
+ return push_int_bigendian(data, i, i<0);
}
+}
+
+
+/* write an integer */
+BOOL asn1_write_Integer(ASN1_DATA *data, int i)
+{
+ if (!asn1_push_tag(data, ASN1_INTEGER)) return False;
+ if (!asn1_write_implicit_Integer(data, i)) return False;
return asn1_pop_tag(data);
}