* gpgkeys_hkp.c (send_key), gpgkeys_ldap.c (send_key, send_key_keyserver):
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 14 Jul 2006 16:07:01 +0000 (16:07 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 14 Jul 2006 16:07:01 +0000 (16:07 +0000)
Fix string matching problem when the ascii armored form of the key happens
to match "KEY" at the beginning of the line.

keyserver/ChangeLog
keyserver/gpgkeys_hkp.c
keyserver/gpgkeys_ldap.c

index 0a4da42..1389924 100644 (file)
@@ -1,3 +1,10 @@
+2006-07-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key), gpgkeys_ldap.c (send_key,
+       send_key_keyserver): Fix string matching problem when the ascii
+       armored form of the key happens to match "KEY" at the beginning of
+       the line.
+
 2006-07-12  David Shaw  <dshaw@jabberwocky.com>
 
        * gpgkeys_ldap.c (printquoted), curl-shim.c (curl_escape): Fix bad
index b3ebcf1..52a01c0 100644 (file)
@@ -86,7 +86,7 @@ send_key(int *eof)
   CURLcode res;
   char request[MAX_URL+15];
   int begin=0,end=0,ret=KEYSERVER_INTERNAL_ERROR;
-  char keyid[17];
+  char keyid[17],state[6];
   char line[MAX_LINE];
   char *key=NULL,*encoded_key=NULL;
   size_t keylen=0,keymax=0;
@@ -94,7 +94,8 @@ send_key(int *eof)
   /* Read and throw away input until we see the BEGIN */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"KEY %16s BEGIN\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
       {
        begin=1;
        break;
@@ -112,7 +113,8 @@ send_key(int *eof)
   /* Now slurp up everything until we see the END */
 
   while(fgets(line,MAX_LINE,input))
-    if(sscanf(line,"KEY %16s END\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
       {
        end=1;
        break;
@@ -194,6 +196,7 @@ send_key(int *eof)
     {
       fprintf(console,"gpgkeys: HTTP post error %d: %s\n",res,errorbuffer);
       ret=curl_err_to_gpg_err(res);
+      goto fail;
     }
   else
     fprintf(output,"\nKEY %s SENT\n",keyid);
index 2e4d39d..6e5345e 100644 (file)
@@ -567,7 +567,7 @@ send_key(int *eof)
 {
   int err,begin=0,end=0,keysize=1,ret=KEYSERVER_INTERNAL_ERROR;
   char *dn=NULL,line[MAX_LINE],*key=NULL;
-  char keyid[17];
+  char keyid[17],state[6];
   LDAPMod **modlist,**addlist,**ml;
 
   modlist=malloc(sizeof(LDAPMod *));
@@ -608,7 +608,8 @@ send_key(int *eof)
   /* Assemble the INFO stuff into LDAP attributes */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"INFO %16s BEGIN\n",keyid)==1)
+    if(sscanf(line,"INFO %16s %5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
       {
        begin=1;
        break;
@@ -653,7 +654,8 @@ send_key(int *eof)
   /* Now parse each line until we see the END */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"INFO %16s END\n",keyid)==1)
+    if(sscanf(line,"INFO %16s %3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
       {
        end=1;
        break;
@@ -674,7 +676,8 @@ send_key(int *eof)
   /* Read and throw away stdin until we see the BEGIN */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"KEY %16s BEGIN\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
       {
        begin=1;
        break;
@@ -692,7 +695,8 @@ send_key(int *eof)
   /* Now slurp up everything until we see the END */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"KEY %16s END\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
       {
        end=1;
        break;
@@ -778,7 +782,7 @@ send_key_keyserver(int *eof)
 {
   int err,begin=0,end=0,keysize=1,ret=KEYSERVER_INTERNAL_ERROR;
   char *dn=NULL,line[MAX_LINE],*key[2]={NULL,NULL};
-  char keyid[17];
+  char keyid[17],state[6];
   LDAPMod mod, *attrs[2];
 
   memset(&mod,0,sizeof(mod));
@@ -812,7 +816,8 @@ send_key_keyserver(int *eof)
   /* Read and throw away stdin until we see the BEGIN */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"KEY %16s BEGIN\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
       {
        begin=1;
        break;
@@ -830,7 +835,8 @@ send_key_keyserver(int *eof)
   /* Now slurp up everything until we see the END */
 
   while(fgets(line,MAX_LINE,input)!=NULL)
-    if(sscanf(line,"KEY %16s END\n",keyid)==1)
+    if(sscanf(line,"KEY %16s %3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
       {
        end=1;
        break;