]> granicus.if.org Git - mutt/commitdiff
Fix bad code in smime_get_field_from_db. Problem noted by Ulf
authorThomas Roessler <roessler@does-not-exist.org>
Sat, 30 Oct 2004 20:45:34 +0000 (20:45 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Sat, 30 Oct 2004 20:45:34 +0000 (20:45 +0000)
Härnhammar <Ulf.Harnhammar.9485@student.uu.se>.

smime.c

diff --git a/smime.c b/smime.c
index 1412992c35bdd1f44de382ac199db71e226d2128..e05a8d2e5dfd9f3b46f95b1b430070fb669bd6e0 100644 (file)
--- a/smime.c
+++ b/smime.c
@@ -479,21 +479,22 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
   char cert_path[_POSIX_PATH_MAX];
   char buf[LONG_STRING], prompt[STRING];
   char fields[5][STRING];
+  char key[STRING];  
   int numFields;
   struct stat info;
-  char *key=NULL, key_trust_level = 0;
+  char key_trust_level = 0;
   FILE *fp;
 
   if(!mailbox && !query) return(NULL);
 
   addr_len = mailbox ? mutt_strlen (mailbox) : 0;
   query_len = query ? mutt_strlen (query) : 0;
+  
+  *key = '\0';
 
   /* index-file format:
      mailbox certfile label issuer_certfile trust_flags\n
 
-     \n is also copied here, serving as delimitation.
-     
      certfile is a hash value generated by openssl.
      Note that this was done according to the OpenSSL
      specs on their CA-directory.
@@ -546,8 +547,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
          {
            found = 0;
            ask = 0;
-           FREE (&key);
-           key = NULL;
+           *key = '\0';
            break;
          }
          else if (choice == M_NO) 
@@ -557,44 +557,46 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
          }
          else if (choice == M_YES)
          {
-           snprintf (key,mutt_strlen(key)+1, fields[1]);
+           strfcpy (key, fields[1], sizeof (key));
            ask = 0;
            break;
          }
        }
        else
        {
-         key = safe_calloc(1, mutt_strlen(fields[1])+2);
-         if (public) key_trust_level = *fields[4];
-         snprintf(key, mutt_strlen(fields[1])+1, "%s", fields[1]);
-
+         if (public) 
+           key_trust_level = *fields[4];
+         strfcpy (key, fields[1], sizeof (key));
        }
        found = 1;
       }
       else if(query)
       {
-       numFields = sscanf (buf, "%s %s %s %s %s\n", fields[0], fields[1],
-                           fields[2], fields[3], fields[4]);
+       numFields = sscanf (buf, 
+                           MUTT_FORMAT(STRING) " " MUTT_FORMAT(STRING) " " 
+                           MUTT_FORMAT(STRING) " " MUTT_FORMAT(STRING) " " 
+                           MUTT_FORMAT(STRING) "\n", 
+                           fields[0], fields[1],
+                           fields[2], fields[3], 
+                           fields[4]);
 
        /* query = label: return certificate. */
        if (numFields >= 3 && 
            !(mutt_strncasecmp (query, fields[2], query_len)))
        {
          ask = 0;
-         key = safe_calloc(1, mutt_strlen(fields[1])+2);
-         snprintf(key, mutt_strlen(fields[1])+1, "%s", fields[1]);
+         strfcpy (key, fields[1], sizeof (key));
        }
        /* query = certificate: return intermediate certificate. */
        else if (numFields >= 4 && 
                 !(mutt_strncasecmp (query, fields[1], query_len)))
        {
          ask = 0;
-         key = safe_calloc(1, mutt_strlen(fields[3])+2);
-         snprintf(key, mutt_strlen(fields[3])+1, "%s", fields[3]);
+         strfcpy (key, fields[3], sizeof (key));
        }
       }
 
-    fclose (fp);
+    safe_fclose (&fp);
 
     if (ask)
     {
@@ -611,10 +613,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
                  mailbox);
       choice = mutt_yesorno (prompt, M_NO);
       if (choice == -1 || choice == M_NO)
-      {
-       FREE (&key);
-       key = NULL;
-      }
+       *key = '\0';
     }
     else if (key_trust_level && may_ask)
     {
@@ -625,11 +624,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
                  key, mailbox);
        choice = mutt_yesorno (prompt, M_NO);
        if (choice != M_YES)
-       {
-         FREE (&key);
-         key = NULL;
-       }
-
+         *key = '\0';
       }
       else if (key_trust_level == 'v' )
       {
@@ -640,13 +635,8 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
 
   }
 
-  if (key)
-  {
-    key[mutt_strlen(key)+1] = '\0';
-    key[mutt_strlen(key)] = '\n';
-  }
-
-  return key;
+  /* Note: safe_strdup ("") returns NULL. */
+  return safe_strdup (key);
 }
 
 
@@ -673,8 +663,6 @@ void _smime_getkeys (char *mailbox)
 
   if (k)
   {
-    k[mutt_strlen (k)-1] = '\0';
-    
     /* the key used last time. */
     if (*SmimeKeyToUse && 
         !mutt_strcasecmp (k, SmimeKeyToUse + mutt_strlen (SmimeKeys)+1))
@@ -806,9 +794,9 @@ char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
       return NULL;
     }
     
-    keylist_size += mutt_strlen (keyID) + 1;
+    keylist_size += mutt_strlen (keyID) + 2;
     safe_realloc (&keylist, keylist_size);
-    sprintf (keylist + keylist_used, "%s", keyID);     /* __SPRINTF_CHECKED__ */
+    sprintf (keylist + keylist_used, "%s\n", keyID);   /* __SPRINTF_CHECKED__ */
     keylist_used = mutt_strlen (keylist);
 
     rfc822_free_address (&addr);
@@ -1396,8 +1384,6 @@ BODY *smime_sign_message (BODY *a )
     mutt_message(_("Warning: Intermediate certificate not found."));
     intermediates = SmimeDefaultKey; /* so openssl won't complain in any case */
   }
-  else
-      intermediates[mutt_strlen (intermediates)-1] = '\0';
 
   convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */