diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog index 984ab61e7..1ecc18b44 100644 --- a/keyserver/ChangeLog +++ b/keyserver/ChangeLog @@ -1,3 +1,9 @@ +2007-07-27 David Shaw + + * gpgkeys_ldap.c (search_key, main): Fix bug where searching for + foo bar (no quotes) on the command line resulted in searching for + "foo\2Abar" due to LDAP quoting. The proper search is "foo*bar". + 2007-04-16 David Shaw * gpgkeys_hkp.c (main): Show curl or fake-curl version string. diff --git a/keyserver/gpgkeys_ldap.c b/keyserver/gpgkeys_ldap.c index 396d28471..7a1df9a63 100644 --- a/keyserver/gpgkeys_ldap.c +++ b/keyserver/gpgkeys_ldap.c @@ -1291,18 +1291,25 @@ printquoted(FILE *stream,char *string,char delim) static int search_key(const char *searchkey) { - char **vals; + char **vals,*search; LDAPMessage *res,*each; int err,count=0; struct keylist *dupelist=NULL; /* The maximum size of the search, including the optional stuff and the trailing \0 */ - char search[2+1+9+1+3+(MAX_LINE*3)+3+1+15+14+1+1+20]; char *attrs[]={"pgpcertid","pgpuserid","pgprevoked","pgpdisabled", "pgpkeycreatetime","pgpkeyexpiretime","modifytimestamp", "pgpkeysize","pgpkeytype",NULL}; enum ks_search_type search_type; + search=malloc(2+1+9+1+3+strlen(searchkey)+3+1+15+14+1+1+20); + if(!search) + { + fprintf(console,"gpgkeys: out of memory when building search list\n"); + fprintf(output,"SEARCH %s FAILED %d\n",searchkey,KEYSERVER_NO_MEMORY); + return KEYSERVER_NO_MEMORY; + } + fprintf(output,"SEARCH %s BEGIN\n",searchkey); search_type=classify_ks_search(&searchkey); @@ -1357,7 +1364,7 @@ search_key(const char *searchkey) break; } - ldap_quote(search,searchkey); + strcat(search,searchkey); switch(search_type) { @@ -1395,6 +1402,7 @@ search_key(const char *searchkey) err=ldap_search_s(ldap,basekeyspacedn, LDAP_SCOPE_SUBTREE,search,attrs,0,&res); + free(search); if(err!=LDAP_SUCCESS && err!=LDAP_SIZELIMIT_EXCEEDED) { int errtag=ldap_err_to_gpg_err(err); @@ -2311,7 +2319,7 @@ main(int argc,char *argv[]) keyptr=keyptr->next; } - searchkey=malloc(len+1); + searchkey=malloc((len*3)+1); if(searchkey==NULL) { ret=KEYSERVER_NO_MEMORY; @@ -2324,7 +2332,7 @@ main(int argc,char *argv[]) keyptr=keylist; while(keyptr!=NULL) { - strcat(searchkey,keyptr->str); + ldap_quote(searchkey,keyptr->str); strcat(searchkey,"*"); keyptr=keyptr->next; }