fix bug in fmt_ldapsearchfilter
free memory for requests we can't handle yet
This commit is contained in:
@@ -28,7 +28,9 @@ int fmt_ldapsubstring(char* dest,struct Substring* s) {
|
||||
}
|
||||
|
||||
int fmt_ldapsearchfilter(char* dest,struct Filter* f) {
|
||||
long sum,tmp,tmp2=0;
|
||||
long sum=0,l=0,tmp;
|
||||
if (!f)
|
||||
return 0;
|
||||
switch (f->type) {
|
||||
case AND: case OR: case NOT:
|
||||
sum=fmt_ldapsearchfilter(dest,f->x); break;
|
||||
@@ -41,22 +43,28 @@ int fmt_ldapsearchfilter(char* dest,struct Filter* f) {
|
||||
|
||||
tmp=fmt_ldapsubstring(0,f->substrings);
|
||||
l=fmt_ldapstring(nd,&f->ava.desc);
|
||||
l+=fmt_asn1SEQUENCE(nd+l,tmp);
|
||||
l+=fmt_ldapsubstring(nd+l,f->substrings);
|
||||
sum=l;
|
||||
sum+=l; if (nd) nd+=l;
|
||||
l=fmt_asn1SEQUENCE(nd,tmp);
|
||||
sum+=l; if (nd) nd+=l;
|
||||
l=fmt_ldapsubstring(nd,f->substrings);
|
||||
sum+=l;
|
||||
}
|
||||
break;
|
||||
case PRESENT:
|
||||
// sum=fmt_ldapstring(dest,&f->ava.desc);
|
||||
return fmt_asn1string(dest,PRIVATE,PRIMITIVE,f->type,f->ava.desc.s,f->ava.desc.l);
|
||||
break;
|
||||
default: return 0;
|
||||
}
|
||||
|
||||
if(f->next) {
|
||||
if (dest) sum+=fmt_ldapsearchfilter(dest+sum,f->next);
|
||||
else sum+=fmt_ldapsearchfilter(dest,f->next);
|
||||
}
|
||||
|
||||
tmp=fmt_asn1length(0,sum);
|
||||
if (!dest) return sum+tmp+1;
|
||||
if (dest) byte_copyr(dest+tmp+1,sum,dest);
|
||||
fmt_asn1tag(dest,PRIVATE,CONSTRUCTED,f->type);
|
||||
fmt_asn1length(dest+1,sum);
|
||||
if (f->next) tmp2=fmt_ldapsearchfilter(dest+sum+tmp+1,f->next);
|
||||
return sum+tmp+tmp2+1;
|
||||
return sum+tmp+1;
|
||||
}
|
||||
|
||||
62
tinyldap.c
62
tinyldap.c
@@ -784,6 +784,8 @@ found:
|
||||
x=x->next;
|
||||
} while (x);
|
||||
}
|
||||
/* TODO: do something with the modify request ;-) */
|
||||
free_ldapmodifyrequest(&mr);
|
||||
} else {
|
||||
buffer_putsflush(buffer_2,"couldn't parse modify request!\n");
|
||||
exit(1);
|
||||
@@ -795,39 +797,41 @@ found:
|
||||
break;
|
||||
case AddRequest:
|
||||
{
|
||||
struct AddRequest ar;
|
||||
struct AddRequest ar;
|
||||
// buffer_putsflush(buffer_2,"AddRequest!\n");
|
||||
if ((tmp=scan_ldapaddrequest(buf+res,buf+res+len,&ar))) {
|
||||
} else {
|
||||
buffer_putsflush(buffer_2,"couldn't parse add request!\n");
|
||||
exit(1);
|
||||
}
|
||||
/* TODO: do something with the add request ;-) */
|
||||
free_ldapaddrequest(&ar);
|
||||
} else {
|
||||
buffer_putsflush(buffer_2,"couldn't parse add request!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
buffer_put(buffer_1,ar.entry.s,ar.entry.l);
|
||||
buffer_putsflush(buffer_1,"\n");
|
||||
if (verbose) { /* iterate all attributes */
|
||||
struct Addition * x;
|
||||
struct AttributeDescriptionList * y;
|
||||
for (x = &ar.a;x;x=x->next) {
|
||||
for (y = &x->vals;y;y=y->next) {
|
||||
buffer_put(buffer_1,x->AttributeDescription.s,x->AttributeDescription.l);
|
||||
buffer_puts(buffer_1,": ");
|
||||
buffer_put(buffer_1,y->a.s,y->a.l);
|
||||
buffer_putsflush(buffer_1,"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
buffer_put(buffer_1,ar.entry.s,ar.entry.l);
|
||||
buffer_putsflush(buffer_1,"\n");
|
||||
if (verbose) { /* iterate all attributes */
|
||||
struct Addition * x;
|
||||
struct AttributeDescriptionList * y;
|
||||
for (x = &ar.a;x;x=x->next) {
|
||||
for (y = &x->vals;y;y=y->next) {
|
||||
buffer_put(buffer_1,x->AttributeDescription.s,x->AttributeDescription.l);
|
||||
buffer_puts(buffer_1,": ");
|
||||
buffer_put(buffer_1,y->a.s,y->a.l);
|
||||
buffer_putsflush(buffer_1,"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
char outbuf[1024];
|
||||
int s=100;
|
||||
int len=fmt_ldapbindresponse(outbuf+s,0,"","","");
|
||||
int hlen=fmt_ldapmessage(0,messageid,AddResponse,len);
|
||||
fmt_ldapmessage(outbuf+s-hlen,messageid,AddResponse,len);
|
||||
write(out,outbuf+s-hlen,len+hlen);
|
||||
}
|
||||
}
|
||||
break;
|
||||
{
|
||||
char outbuf[1024];
|
||||
int s=100;
|
||||
int len=fmt_ldapbindresponse(outbuf+s,0,"","","");
|
||||
int hlen=fmt_ldapmessage(0,messageid,AddResponse,len);
|
||||
fmt_ldapmessage(outbuf+s-hlen,messageid,AddResponse,len);
|
||||
write(out,outbuf+s-hlen,len+hlen);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
buffer_puts(buffer_2,"unknown request type ");
|
||||
buffer_putulong(buffer_2,op);
|
||||
|
||||
Reference in New Issue
Block a user