Jacob's last-minute testing found a couple of trivial bugs in
[u/mdw/putty] / import.c
index d00f31f..d1ab751 100644 (file)
--- a/import.c
+++ b/import.c
@@ -160,12 +160,11 @@ static int ber_read_id_len(void *source, int sourcelen,
     if ((*p & 0x1F) == 0x1F) {
        *id = 0;
        while (*p & 0x80) {
-           *id = (*id << 7) | (*p & 0x7F);
            p++, sourcelen--;
            if (sourcelen == 0)
                return -1;
+           *id = (*id << 7) | (*p & 0x7F);
        }
-       *id = (*id << 7) | (*p & 0x7F);
        p++, sourcelen--;
     } else {
        *id = *p & 0x1F;
@@ -326,7 +325,7 @@ static struct openssh_key *load_openssh_key(const Filename *filename)
     char base64_bit[4];
     int base64_chars = 0;
 
-    ret = smalloc(sizeof(*ret));
+    ret = snew(struct openssh_key);
     ret->keyblob = NULL;
     ret->keyblob_len = ret->keyblob_size = 0;
     ret->encrypted = 0;
@@ -416,7 +415,8 @@ static struct openssh_key *load_openssh_key(const Filename *filename)
 
                     if (ret->keyblob_len + len > ret->keyblob_size) {
                         ret->keyblob_size = ret->keyblob_len + len + 256;
-                        ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size);
+                        ret->keyblob = sresize(ret->keyblob, ret->keyblob_size,
+                                              unsigned char);
                     }
 
                     memcpy(ret->keyblob + ret->keyblob_len, out, len);
@@ -483,9 +483,9 @@ struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase)
     struct ssh2_userkey *retval = NULL;
     char *errmsg;
     unsigned char *blob;
-    int blobsize, blobptr, privptr;
-    char *modptr;
-    int modlen;
+    int blobsize = 0, blobptr, privptr;
+    char *modptr = NULL;
+    int modlen = 0;
 
     blob = NULL;
 
@@ -559,12 +559,14 @@ struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase)
        num_integers = 9;
     else if (key->type == OSSH_DSA)
        num_integers = 6;
+    else
+       num_integers = 0;              /* placate compiler warnings */
 
     /*
      * Space to create key blob in.
      */
     blobsize = 256+key->keyblob_len;
-    blob = smalloc(blobsize);
+    blob = snewn(blobsize, unsigned char);
     PUT_32BIT(blob, 7);
     if (key->type == OSSH_DSA)
        memcpy(blob+4, "ssh-dss", 7);
@@ -580,6 +582,7 @@ struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase)
        if (ret < 0 || id != 2 ||
            key->keyblob+key->keyblob_len-p < len) {
            errmsg = "ASN.1 decoding failure";
+           retval = SSH2_WRONG_PASSPHRASE;
            goto error;
        }
 
@@ -636,7 +639,7 @@ struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase)
      * the sanity checks for free.
      */
     assert(privptr > 0);              /* should have bombed by now if not */
-    retkey = smalloc(sizeof(struct ssh2_userkey));
+    retkey = snew(struct ssh2_userkey);
     retkey->alg = (key->type == OSSH_RSA ? &ssh_rsa : &ssh_dss);
     retkey->data = retkey->alg->createkey(blob, privptr,
                                          blob+privptr, blobptr-privptr);
@@ -666,7 +669,7 @@ int openssh_write(const Filename *filename, struct ssh2_userkey *key,
                  char *passphrase)
 {
     unsigned char *pubblob, *privblob, *spareblob;
-    int publen, privlen, sparelen;
+    int publen, privlen, sparelen = 0;
     unsigned char *outblob;
     int outlen;
     struct mpint_pos numbers[9];
@@ -719,7 +722,7 @@ int openssh_write(const Filename *filename, struct ssh2_userkey *key,
         dmp1.bytes = (bignum_bitcount(bdmp1)+8)/8;
         dmq1.bytes = (bignum_bitcount(bdmq1)+8)/8;
         sparelen = dmp1.bytes + dmq1.bytes;
-        spareblob = smalloc(sparelen);
+        spareblob = snewn(sparelen, unsigned char);
         dmp1.start = spareblob;
         dmq1.start = spareblob + dmp1.bytes;
         for (i = 0; i < dmp1.bytes; i++)
@@ -791,7 +794,7 @@ int openssh_write(const Filename *filename, struct ssh2_userkey *key,
     /*
      * Now we know how big outblob needs to be. Allocate it.
      */
-    outblob = smalloc(outlen);
+    outblob = snewn(outlen, unsigned char);
 
     /*
      * And write the data into it.
@@ -996,7 +999,7 @@ static struct sshcom_key *load_sshcom_key(const Filename *filename)
     char base64_bit[4];
     int base64_chars = 0;
 
-    ret = smalloc(sizeof(*ret));
+    ret = snew(struct sshcom_key);
     ret->comment[0] = '\0';
     ret->keyblob = NULL;
     ret->keyblob_len = ret->keyblob_size = 0;
@@ -1072,7 +1075,8 @@ static struct sshcom_key *load_sshcom_key(const Filename *filename)
 
                     if (ret->keyblob_len + len > ret->keyblob_size) {
                         ret->keyblob_size = ret->keyblob_len + len + 256;
-                        ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size);
+                        ret->keyblob = sresize(ret->keyblob, ret->keyblob_size,
+                                              unsigned char);
                     }
 
                     memcpy(ret->keyblob + ret->keyblob_len, out, len);
@@ -1199,7 +1203,7 @@ struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase)
     struct ssh2_userkey *ret = NULL, *retkey;
     const struct ssh_signkey *alg;
     unsigned char *blob = NULL;
-    int blobsize, publen, privlen;
+    int blobsize = 0, publen, privlen;
 
     if (!key)
         return NULL;
@@ -1320,7 +1324,7 @@ struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase)
      * Strip away the containing string to get to the real meat.
      */
     len = GET_32BIT(ciphertext);
-    if (len > cipherlen-4) {
+    if (len < 0 || len > cipherlen-4) {
         errmsg = "containing string was ill-formed";
         goto error;
     }
@@ -1333,7 +1337,7 @@ struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase)
      * end up feeding them to alg->createkey().
      */
     blobsize = cipherlen + 256;
-    blob = smalloc(blobsize);
+    blob = snewn(blobsize, unsigned char);
     privlen = 0;
     if (type == RSA) {
         struct mpint_pos n, e, d, u, p, q;
@@ -1387,11 +1391,12 @@ struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase)
         publen = pos;
         pos += put_mp(blob+pos, x.start, x.bytes);
         privlen = pos - publen;
-    }
+    } else
+       return NULL;
 
     assert(privlen > 0);              /* should have bombed by now if not */
 
-    retkey = smalloc(sizeof(struct ssh2_userkey));
+    retkey = snew(struct ssh2_userkey);
     retkey->alg = alg;
     retkey->data = alg->createkey(blob, publen, blob+publen, privlen);
     if (!retkey->data) {
@@ -1502,7 +1507,7 @@ int sshcom_write(const Filename *filename, struct ssh2_userkey *key,
     outlen = 512;
     for (i = 0; i < nnumbers; i++)
        outlen += 4 + numbers[i].bytes;
-    outblob = smalloc(outlen);
+    outblob = snewn(outlen, unsigned char);
 
     /*
      * Create the unencrypted key blob.