diff options
-rw-r--r-- | source4/libcli/ldap/ldap.c | 2 | ||||
-rw-r--r-- | source4/libcli/util/asn1.c | 34 |
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); } |