summaryrefslogtreecommitdiffstats
path: root/fmt_asn1generic.c
diff options
context:
space:
mode:
authorSimon Rettberg2017-04-21 16:31:06 +0200
committerSimon Rettberg2017-04-21 16:31:06 +0200
commitb61176f17b59a94750dff1f959231dadc4e6078a (patch)
tree88ee419323ba332a1dd06c5aa801c87f59b36bb3 /fmt_asn1generic.c
parentldadp.h: Add missing SearchRequestReference opcode (diff)
downloadldadp-b61176f17b59a94750dff1f959231dadc4e6078a.tar.gz
ldadp-b61176f17b59a94750dff1f959231dadc4e6078a.tar.xz
ldadp-b61176f17b59a94750dff1f959231dadc4e6078a.zip
Update ldap/asn1/... files with current tinyldap
Diffstat (limited to 'fmt_asn1generic.c')
-rw-r--r--fmt_asn1generic.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/fmt_asn1generic.c b/fmt_asn1generic.c
index c97ee96..f864012 100644
--- a/fmt_asn1generic.c
+++ b/fmt_asn1generic.c
@@ -6,7 +6,6 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
size_t containerstack[100];
size_t curinstack=0;
va_list args;
- va_start(args,fmt);
unsigned long* application=0;
struct string* s;
struct oid* o;
@@ -17,6 +16,7 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
unsigned long desttag=0;
unsigned long appstore;
int stringtype;
+ va_start(args,fmt);
while (*fmt) {
char* realdest=dest?dest+cursor:NULL;
switch (*fmt) {
@@ -32,6 +32,20 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
application=NULL;
curlen+=fmt_asn1length(realdest?realdest+curlen:NULL,0);
break;
+ case 'B': // send boolean
+ {
+ int i=va_arg(args,int);
+ if (i!=0 && i!=1) {
+ va_end(args);
+ return 0;
+ }
+ if (application)
+ curlen=fmt_asn1int(realdest,APPLICATION,PRIMITIVE,*application,i);
+ else
+ curlen=fmt_asn1int(realdest,UNIVERSAL,PRIMITIVE,BOOLEAN,i);
+ application=NULL;
+ break;
+ }
case 'i': // send integer
{
unsigned long i=va_arg(args,unsigned long);
@@ -50,7 +64,7 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
curlen=fmt_asn1bitstring(realdest,UNIVERSAL,PRIMITIVE,BIT_STRING,s->s,s->l);
application=NULL;
break;
- case 'B':
+ case 'I':
stringtype=BIT_STRING;
goto stringcopy;
case 'A':
@@ -122,7 +136,10 @@ stringcopy_alt:
* sequence data backwards to make room to write the ASN.1 length */
{
char* anfang;
- if (!curinstack) return 0;
+ if (!curinstack) {
+ va_end(args);
+ return 0;
+ }
anfang=dest+containerstack[--curinstack];
seqlen=dest+cursor-anfang;
curlen=fmt_asn1length(NULL,seqlen);
@@ -135,5 +152,6 @@ stringcopy_alt:
cursor+=curlen;
++fmt;
}
+ va_end(args);
return cursor;
}