From d177cd15aa73464eb4e447c6e2fc4ff31f4ecbab Mon Sep 17 00:00:00 2001 From: leitner Date: Tue, 28 Aug 2018 16:11:17 +0000 Subject: [PATCH] we used addreponse instead of modifyresponse opcode in response to modify requests --- Makefile | 3 ++- fmt_ldapmodifyrequest.c | 40 ++++++++++++++++++++++++++++++++++++++++ tinyldap.c | 4 ++-- 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 fmt_ldapmodifyrequest.c diff --git a/Makefile b/Makefile index 27e2cf8..1ebcc7e 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,8 @@ scan_ldapmodifyrequest.o scan_ldapaddrequest.o bstrlen.o bstrfirst.o \ bstrstart.o free_ldapadl.o free_ldappal.o free_ldapsearchfilter.o \ scan_ldapsearchfilterstring.o free_ldapsearchresultentry.o \ fmt_ldapsearchfilterstring.o ldap_match_sre.o \ -fmt_ldapdeleterequest.o scan_ldapdeleterequest.o normalize_dn.o +fmt_ldapdeleterequest.o scan_ldapdeleterequest.o normalize_dn.o \ +fmt_ldapmodifyrequest.o ldif.a: ldif_parse.o ldap_match_mapped.o diff --git a/fmt_ldapmodifyrequest.c b/fmt_ldapmodifyrequest.c new file mode 100644 index 0000000..ec7204a --- /dev/null +++ b/fmt_ldapmodifyrequest.c @@ -0,0 +1,40 @@ +#include "ldap.h" +#include +#include + +#include + +size_t fmt_ldapmodifyrequest(char* dest,const struct ModifyRequest* m) { + size_t i,n,l,sum; + const struct Modification* x; + size_t* ls; // lengths of the changes + size_t* lss; // lengths of the inner sequences in the changes + char* orig=dest; + for (x=&m->m, l=0; x; x=x->next, ++l); // how many changes? + if (l>1000) return 0; + // now for each change, calculate size of change sequence + ls = (size_t*)alloca(l*sizeof(size_t)); + lss = (size_t*)alloca(l*sizeof(size_t)); + for (x=&m->m, sum=i=0; x; x=x->next, ++i) { + lss[i] = fmt_ldapstring(NULL, &x->AttributeDescription) + + fmt_ldapavl(NULL, x->vals); + ls[i] = fmt_asn1ENUMERATED(NULL, x->operation) + + fmt_asn1SEQUENCE(NULL, lss[i]) + + lss[i]; + sum += ls[i] + fmt_asn1SEQUENCE(NULL, ls[i]);; + } + n=fmt_ldapstring(dest,&m->object); + if (!dest) + return n + fmt_asn1SEQUENCE(NULL, sum) + sum; + dest += n; + dest += fmt_asn1SEQUENCE(dest, sum); + for (x=&m->m, i=0; x; x=x->next, ++i) { + dest += fmt_asn1SEQUENCE(dest, ls[i]); + dest += fmt_asn1ENUMERATED(dest, x->operation); + dest += fmt_asn1SEQUENCE(dest, lss[i]); + dest += fmt_ldapstring(dest, &x->AttributeDescription); + dest += fmt_ldapavl(dest, x->vals); + } + return dest-orig; +} + diff --git a/tinyldap.c b/tinyldap.c index 7b39bbb..9cf00a8 100644 --- a/tinyldap.c +++ b/tinyldap.c @@ -1778,8 +1778,8 @@ authfailure: char outbuf[1024]; int s=100; int len=fmt_ldapresult(outbuf+s,err,"","",""); - int hlen=fmt_ldapmessage(0,messageid,AddResponse,len); - fmt_ldapmessage(outbuf+s-hlen,messageid,AddResponse,len); + int hlen=fmt_ldapmessage(0,messageid,ModifyResponse,len); + fmt_ldapmessage(outbuf+s-hlen,messageid,ModifyResponse,len); write(out,outbuf+s-hlen,len+hlen); }