Remove a bashism in mksrcarc.sh, without which bob builds fail on
[sgt/putty] / sshpubk.c
index 2d5ff1d..88ff179 100644 (file)
--- a/sshpubk.c
+++ b/sshpubk.c
@@ -71,11 +71,6 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
     if (i < 0)
        goto end;                      /* overran */
 
-    if (pub_only) {
-       ret = 1;
-       goto end;
-    }
-
     /* Next, the comment field. */
     j = GET_32BIT(buf + i);
     i += 4;
@@ -88,9 +83,17 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
     }
     i += j;
     if (commentptr)
-       *commentptr = comment;
+       *commentptr = dupstr(comment);
     if (key)
        key->comment = comment;
+    else
+       sfree(comment);
+
+    if (pub_only) {
+       ret = 1;
+       goto end;
+    }
+
     if (!key) {
        ret = ciphertype != 0;
        *error = NULL;
@@ -159,7 +162,7 @@ int loadrsakey(const Filename *filename, struct RSAKey *key, char *passphrase,
     int ret = 0;
     const char *error = NULL;
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp) {
        error = "can't open file";
        goto end;
@@ -200,7 +203,7 @@ int rsakey_encrypted(const Filename *filename, char **comment)
     FILE *fp;
     char buf[64];
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp)
        return 0;                      /* doesn't even exist */
 
@@ -225,7 +228,7 @@ int rsakey_encrypted(const Filename *filename, char **comment)
  * exponent, modulus).
  */
 int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
-                  const char **errorstr)
+                  char **commentptr, const char **errorstr)
 {
     FILE *fp;
     char buf[64];
@@ -238,7 +241,7 @@ int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
     *bloblen = 0;
     ret = 0;
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp) {
        error = "can't open file";
        goto end;
@@ -250,7 +253,7 @@ int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
      */
     if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
        memset(&key, 0, sizeof(key));
-       if (loadrsakey_main(fp, &key, TRUE, NULL, NULL, &error)) {
+       if (loadrsakey_main(fp, &key, TRUE, commentptr, NULL, &error)) {
            *blob = rsa_public_blob(&key, bloblen);
            freersakey(&key);
            ret = 1;
@@ -361,7 +364,7 @@ int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase)
     /*
      * Done. Write the result to the file.
      */
-    fp = f_open(*filename, "wb");
+    fp = f_open(filename, "wb", TRUE);
     if (fp) {
        int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf));
         if (fclose(fp))
@@ -492,16 +495,14 @@ static char *read_body(FILE * fp)
 
     while (1) {
        c = fgetc(fp);
-       if (c == '\r' || c == '\n') {
-           c = fgetc(fp);
-           if (c != '\r' && c != '\n' && c != EOF)
-               ungetc(c, fp);
+       if (c == '\r' || c == '\n' || c == EOF) {
+           if (c != EOF) {
+               c = fgetc(fp);
+               if (c != '\r' && c != '\n')
+                   ungetc(c, fp);
+           }
            return text;
        }
-       if (c == EOF) {
-           sfree(text);
-           return NULL;
-       }
        if (len + 1 >= size) {
            size += 128;
            text = sresize(text, size, char);
@@ -631,7 +632,7 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
     encryption = comment = mac = NULL;
     public_blob = private_blob = NULL;
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp) {
        error = "can't open file";
        goto error;
@@ -865,8 +866,9 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
     return ret;
 }
 
-char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
-                          int *pub_blob_len, const char **errorstr)
+unsigned char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
+                                   int *pub_blob_len, char **commentptr,
+                                   const char **errorstr)
 {
     FILE *fp;
     char header[40], *b;
@@ -875,10 +877,11 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
     int public_blob_len;
     int i;
     const char *error = NULL;
+    char *comment;
 
     public_blob = NULL;
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp) {
        error = "can't open file";
        goto error;
@@ -912,9 +915,13 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
     /* Read the Comment header line. */
     if (!read_header(fp, header) || 0 != strcmp(header, "Comment"))
        goto error;
-    if ((b = read_body(fp)) == NULL)
+    if ((comment = read_body(fp)) == NULL)
        goto error;
-    sfree(b);                         /* we don't care */
+
+    if (commentptr)
+       *commentptr = comment;
+    else
+       sfree(comment);
 
     /* Read the Public-Lines header line and the public blob. */
     if (!read_header(fp, header) || 0 != strcmp(header, "Public-Lines"))
@@ -931,7 +938,7 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
        *pub_blob_len = public_blob_len;
     if (algorithm)
        *algorithm = alg->name;
-    return (char *)public_blob;
+    return public_blob;
 
     /*
      * Error processing.
@@ -955,7 +962,7 @@ int ssh2_userkey_encrypted(const Filename *filename, char **commentptr)
     if (commentptr)
        *commentptr = NULL;
 
-    fp = f_open(*filename, "rb");
+    fp = f_open(filename, "rb", FALSE);
     if (!fp)
        return 0;
     if (!read_header(fp, header)
@@ -1136,7 +1143,7 @@ int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key,
        memset(&s, 0, sizeof(s));
     }
 
-    fp = f_open(*filename, "w");
+    fp = f_open(filename, "w", TRUE);
     if (!fp)
        return 0;
     fprintf(fp, "PuTTY-User-Key-File-2: %s\n", key->alg->name);
@@ -1172,7 +1179,7 @@ int key_type(const Filename *filename)
     const char openssh_sig[] = "-----BEGIN ";
     int i;
 
-    fp = f_open(*filename, "r");
+    fp = f_open(filename, "r", FALSE);
     if (!fp)
        return SSH_KEYTYPE_UNOPENABLE;
     i = fread(buf, 1, sizeof(buf), fp);