r2347: merge LDAP ASN.1 fixes from trunk
authorStefan Metzmacher <metze@samba.org>
Wed, 15 Sep 2004 13:29:59 +0000 (13:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:58:45 +0000 (12:58 -0500)
metze

source/libcli/ldap/ldap.c
source/libcli/util/asn1.c

index b7ae58f7f56c1d66d013dd235b4843e746fe2f77..7af9ca42c54aad71bb2de151963cd12aafe8925c 100644 (file)
@@ -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;
        }
index b5db9b157ebcedbf2257106141aeeeb599bcbd77..ca62a0b57484db0100e67588929ecafc10912ffe 100644 (file)
@@ -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);
 }