]> git.sur5r.net Git - openldap/commitdiff
ITS#8733 Allow extraction of the complete ber element
authorHallvard Furuseth <hallvard@openldap.org>
Fri, 23 Jun 2017 09:55:36 +0000 (10:55 +0100)
committerOndřej Kuzník <ondra@mistotebe.net>
Thu, 28 Sep 2017 13:14:55 +0000 (14:14 +0100)
include/lber.h
libraries/liblber/decode.c

index b93d8e3b6b7335e77de7bfa140a1c0b87f49c38c..e0ea43d4aaac2fca1fbb3c38a80c9a6c6c5c995b 100644 (file)
@@ -255,6 +255,11 @@ ber_peek_tag LDAP_P((
        BerElement *ber,
        ber_len_t *len ));
 
+LBER_F( ber_tag_t )
+ber_skip_raw LDAP_P((
+       BerElement *ber,
+       struct berval *bv ));
+
 LBER_F( ber_tag_t )
 ber_skip_element LDAP_P((
        BerElement *ber,
index 4ee83263aef3f8354c62ad1f393233b985ed548a..7de08229f87872c7b3c9720e6bfd4e7b87f7b8e8 100644 (file)
@@ -234,6 +234,25 @@ ber_skip_element( BerElement *ber, struct berval *bv )
        return tag;
 }
 
+/* Move past next element, point *bv at the complete element in-place, and
+ * return its tag. The caller may \0-terminate *bv, as next octet is saved in
+ * ber->ber_tag. Similar to ber_skip_element(ber, bv) except the tag+length
+ * header is also included in *bv.
+ */
+ber_tag_t
+ber_skip_raw( BerElement *ber, struct berval *bv )
+{
+       char            *val = ber->ber_ptr;
+       ber_tag_t       tag = ber_skip_element( ber, bv );
+
+       if ( tag != LBER_DEFAULT ) {
+               bv->bv_len += bv->bv_val - val;
+               bv->bv_val = val;
+       }
+
+       return tag;
+}
+
 ber_tag_t
 ber_peek_tag(
        BerElement *ber,