use error/logit/fatal instead of fprintf(stderr, ...) and exit(0),
authordjm <djm@openbsd.org>
Fri, 17 Apr 2015 13:19:22 +0000 (13:19 +0000)
committerdjm <djm@openbsd.org>
Fri, 17 Apr 2015 13:19:22 +0000 (13:19 +0000)
fix a few errors that were being printed to stdout instead of stderr
and a few non-errors that were going to stderr instead of stdout
bz#2325; ok dtucker

usr.bin/ssh/ssh-keygen.c

index 577bc5b..5548e60 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keygen.c,v 1.268 2015/03/31 11:06:49 tobias Exp $ */
+/* $OpenBSD: ssh-keygen.c,v 1.269 2015/04/17 13:19:22 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -178,10 +178,8 @@ type_bits_valid(int type, const char *name, u_int32_t *bitsp)
 {
        u_int maxbits, nid;
 
-       if (type == KEY_UNSPEC) {
-               fprintf(stderr, "unknown key type %s\n", key_type_name);
-               exit(1);
-       }
+       if (type == KEY_UNSPEC)
+               fatal("unknown key type %s", key_type_name);
        if (*bitsp == 0) {
                if (type == KEY_DSA)
                        *bitsp = DEFAULT_BITS_DSA;
@@ -197,10 +195,8 @@ type_bits_valid(int type, const char *name, u_int32_t *bitsp)
        }
        maxbits = (type == KEY_DSA) ?
            OPENSSL_DSA_MAX_MODULUS_BITS : OPENSSL_RSA_MAX_MODULUS_BITS;
-       if (*bitsp > maxbits) {
-               fprintf(stderr, "key bits exceeds maximum %d\n", maxbits);
-               exit(1);
-       }
+       if (*bitsp > maxbits)
+               fatal("key bits exceeds maximum %d", maxbits);
 #ifdef WITH_OPENSSL
        if (type == KEY_DSA && *bitsp != 1024)
                fatal("DSA keys must be 1024 bits");
@@ -244,13 +240,13 @@ ask_filename(struct passwd *pw, const char *prompt)
                        name = _PATH_SSH_CLIENT_ID_ED25519;
                        break;
                default:
-                       fprintf(stderr, "bad key type\n");
-                       exit(1);
-                       break;
+                       fatal("bad key type");
                }
        }
-       snprintf(identity_file, sizeof(identity_file), "%s/%s", pw->pw_dir, name);
-       fprintf(stderr, "%s (%s): ", prompt, identity_file);
+       snprintf(identity_file, sizeof(identity_file),
+           "%s/%s", pw->pw_dir, name);
+       printf("%s (%s): ", prompt, identity_file);
+       fflush(stdout);
        if (fgets(buf, sizeof(buf), stdin) == NULL)
                exit(1);
        buf[strcspn(buf, "\n")] = '\0';
@@ -296,14 +292,10 @@ do_convert_to_ssh2(struct passwd *pw, struct sshkey *k)
        char comment[61];
        int r;
 
-       if (k->type == KEY_RSA1) {
-               fprintf(stderr, "version 1 keys are not supported\n");
-               exit(1);
-       }
-       if ((r = sshkey_to_blob(k, &blob, &len)) != 0) {
-               fprintf(stderr, "key_to_blob failed: %s\n", ssh_err(r));
-               exit(1);
-       }
+       if (k->type == KEY_RSA1)
+               fatal("version 1 keys are not supported");
+       if ((r = sshkey_to_blob(k, &blob, &len)) != 0)
+               fatal("key_to_blob failed: %s", ssh_err(r));
        /* Comment + surrounds must fit into 72 chars (RFC 4716 sec 3.3) */
        snprintf(comment, sizeof(comment),
            "%u-bit %s, converted by %s@%s from OpenSSH",
@@ -530,17 +522,13 @@ get_line(FILE *fp, char *line, size_t len)
 
        line[0] = '\0';
        while ((c = fgetc(fp)) != EOF) {
-               if (pos >= len - 1) {
-                       fprintf(stderr, "input line too long.\n");
-                       exit(1);
-               }
+               if (pos >= len - 1)
+                       fatal("input line too long.");
                switch (c) {
                case '\r':
                        c = fgetc(fp);
-                       if (c != EOF && c != '\n' && ungetc(c, fp) == EOF) {
-                               fprintf(stderr, "unget: %s\n", strerror(errno));
-                               exit(1);
-                       }
+                       if (c != EOF && c != '\n' && ungetc(c, fp) == EOF)
+                               fatal("unget: %s", strerror(errno));
                        return pos;
                case '\n':
                        return pos;
@@ -592,16 +580,12 @@ do_convert_from_ssh2(struct passwd *pw, struct sshkey **k, int *private)
            (encoded[len-3] == '='))
                encoded[len-3] = '\0';
        blen = uudecode(encoded, blob, sizeof(blob));
-       if (blen < 0) {
-               fprintf(stderr, "uudecode failed.\n");
-               exit(1);
-       }
+       if (blen < 0)
+               fatal("uudecode failed.");
        if (*private)
                *k = do_convert_private_ssh2_from_blob(blob, blen);
-       else if ((r = sshkey_from_blob(blob, blen, k)) != 0) {
-               fprintf(stderr, "decode blob failed: %s\n", ssh_err(r));
-               exit(1);
-       }
+       else if ((r = sshkey_from_blob(blob, blen, k)) != 0)
+               fatal("decode blob failed: %s", ssh_err(r));
        fclose(fp);
 }
 
@@ -731,10 +715,8 @@ do_convert_from(struct passwd *pw)
                }
        }
 
-       if (!ok) {
-               fprintf(stderr, "key write failed\n");
-               exit(1);
-       }
+       if (!ok)
+               fatal("key write failed");
        sshkey_free(k);
        exit(0);
 }
@@ -749,13 +731,11 @@ do_print_public(struct passwd *pw)
 
        if (!have_identity)
                ask_filename(pw, "Enter file in which the key is");
-       if (stat(identity_file, &st) < 0) {
-               perror(identity_file);
-               exit(1);
-       }
+       if (stat(identity_file, &st) < 0)
+               fatal("%s: %s", identity_file, strerror(errno));
        prv = load_identity(identity_file);
        if ((r = sshkey_write(prv, stdout)) != 0)
-               fprintf(stderr, "key_write failed: %s", ssh_err(r));
+               error("key_write failed: %s", ssh_err(r));
        sshkey_free(prv);
        fprintf(stdout, "\n");
        exit(0);
@@ -820,10 +800,8 @@ do_fingerprint(struct passwd *pw)
        rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_DEFAULT;
        if (!have_identity)
                ask_filename(pw, "Enter file in which the key is");
-       if (stat(identity_file, &st) < 0) {
-               perror(identity_file);
-               exit(1);
-       }
+       if (stat(identity_file, &st) < 0)
+               fatal("%s: %s", identity_file, strerror(errno));
        if ((r = sshkey_load_public(identity_file, &public, &comment)) != 0)
                debug2("Error loading public key \"%s\": %s",
                    identity_file, ssh_err(r));
@@ -915,10 +893,8 @@ do_fingerprint(struct passwd *pw)
        }
        fclose(f);
 
-       if (invalid) {
-               printf("%s is not a public key file.\n", identity_file);
-               exit(1);
-       }
+       if (invalid)
+               fatal("%s is not a public key file.", identity_file);
        exit(0);
 }
 
@@ -953,7 +929,7 @@ do_gen_all_hostkeys(struct passwd *pw)
                if (stat(key_types[i].path, &st) == 0)
                        continue;
                if (errno != ENOENT) {
-                       printf("Could not stat %s: %s", key_types[i].path,
+                       error("Could not stat %s: %s", key_types[i].path,
                            strerror(errno));
                        first = 0;
                        continue;
@@ -970,8 +946,7 @@ do_gen_all_hostkeys(struct passwd *pw)
                bits = 0;
                type_bits_valid(type, NULL, &bits);
                if ((r = sshkey_generate(type, bits, &private)) != 0) {
-                       fprintf(stderr, "key_generate failed: %s\n",
-                           ssh_err(r));
+                       error("key_generate failed: %s", ssh_err(r));
                        first = 0;
                        continue;
                }
@@ -981,8 +956,8 @@ do_gen_all_hostkeys(struct passwd *pw)
                    hostname);
                if ((r = sshkey_save_private(private, identity_file, "",
                    comment, use_new_format, new_format_cipher, rounds)) != 0) {
-                       printf("Saving key \"%s\" failed: %s\n", identity_file,
-                           ssh_err(r));
+                       error("Saving key \"%s\" failed: %s",
+                           identity_file, ssh_err(r));
                        sshkey_free(private);
                        sshkey_free(public);
                        first = 0;
@@ -992,7 +967,7 @@ do_gen_all_hostkeys(struct passwd *pw)
                strlcat(identity_file, ".pub", sizeof(identity_file));
                fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
                if (fd == -1) {
-                       printf("Could not save your public key in %s\n",
+                       error("Could not save your public key in %s",
                            identity_file);
                        sshkey_free(public);
                        first = 0;
@@ -1000,14 +975,14 @@ do_gen_all_hostkeys(struct passwd *pw)
                }
                f = fdopen(fd, "w");
                if (f == NULL) {
-                       printf("fdopen %s failed\n", identity_file);
+                       error("fdopen %s failed", identity_file);
                        close(fd);
                        sshkey_free(public);
                        first = 0;
                        continue;
                }
                if ((r = sshkey_write(public, f)) != 0) {
-                       fprintf(stderr, "write key failed: %s\n", ssh_err(r));
+                       error("write key failed: %s", ssh_err(r));
                        fclose(f);
                        sshkey_free(public);
                        first = 0;
@@ -1048,8 +1023,8 @@ known_hosts_hash(struct hostkey_foreach_line *l, void *_ctx)
                    has_wild || l->marker != MRK_NONE) {
                        fprintf(ctx->out, "%s\n", l->line);
                        if (has_wild && !find_host) {
-                               fprintf(stderr, "%s:%ld: ignoring host name "
-                                   "with wildcard: %.64s\n", l->path,
+                               logit("%s:%ld: ignoring host name "
+                                   "with wildcard: %.64s", l->path,
                                    l->linenum, l->hosts);
                        }
                        return 0;
@@ -1070,7 +1045,7 @@ known_hosts_hash(struct hostkey_foreach_line *l, void *_ctx)
        case HKF_STATUS_INVALID:
                /* Retain invalid lines, but mark file as invalid. */
                ctx->invalid = 1;
-               fprintf(stderr, "%s:%ld: invalid line\n", l->path, l->linenum);
+               logit("%s:%ld: invalid line", l->path, l->linenum);
                /* FALLTHROUGH */
        default:
                fprintf(ctx->out, "%s\n", l->line);
@@ -1120,8 +1095,7 @@ known_hosts_find_delete(struct hostkey_foreach_line *l, void *_ctx)
                /* Retain non-matching hosts when deleting */
                if (l->status == HKF_STATUS_INVALID) {
                        ctx->invalid = 1;
-                       fprintf(stderr, "%s:%ld: invalid line\n",
-                           l->path, l->linenum);
+                       logit("%s:%ld: invalid line", l->path, l->linenum);
                }
                fprintf(ctx->out, "%s\n", l->line);
        }
@@ -1179,17 +1153,15 @@ do_known_hosts(struct passwd *pw, const char *name)
                fclose(ctx.out);
 
        if (ctx.invalid) {
-               fprintf(stderr, "%s is not a valid known_hosts file.\n",
-                   identity_file);
+               error("%s is not a valid known_hosts file.", identity_file);
                if (inplace) {
-                       fprintf(stderr, "Not replacing existing known_hosts "
-                           "file because of errors\n");
+                       error("Not replacing existing known_hosts "
+                           "file because of errors");
                        unlink(tmp);
                }
                exit(1);
        } else if (delete_host && !ctx.found_key) {
-               fprintf(stderr, "Host %s not found in %s\n",
-                   name, identity_file);
+               logit("Host %s not found in %s", name, identity_file);
                unlink(tmp);
        } else if (inplace) {
                /* Backup existing file */
@@ -1207,13 +1179,12 @@ do_known_hosts(struct passwd *pw, const char *name)
                        exit(1);
                }
 
-               fprintf(stderr, "%s updated.\n", identity_file);
-               fprintf(stderr, "Original contents retained as %s\n", old);
+               printf("%s updated.\n", identity_file);
+               printf("Original contents retained as %s\n", old);
                if (ctx.has_unhashed) {
-                       fprintf(stderr, "WARNING: %s contains unhashed "
-                           "entries\n", old);
-                       fprintf(stderr, "Delete this file to ensure privacy "
-                           "of hostnames\n");
+                       logit("WARNING: %s contains unhashed entries", old);
+                       logit("Delete this file to ensure privacy "
+                           "of hostnames");
                }
        }
 
@@ -1235,10 +1206,8 @@ do_change_passphrase(struct passwd *pw)
 
        if (!have_identity)
                ask_filename(pw, "Enter file in which the key is");
-       if (stat(identity_file, &st) < 0) {
-               perror(identity_file);
-               exit(1);
-       }
+       if (stat(identity_file, &st) < 0)
+               fatal("%s: %s", identity_file, strerror(errno));
        /* Try to load the file with empty passphrase. */
        r = sshkey_load_private(identity_file, "", &private, &comment);
        if (r == SSH_ERR_KEY_WRONG_PASSPHRASE) {
@@ -1256,9 +1225,7 @@ do_change_passphrase(struct passwd *pw)
                        goto badkey;
        } else if (r != 0) {
  badkey:
-               fprintf(stderr, "Failed to load key \"%s\": %s\n",
-                   identity_file, ssh_err(r));
-               exit(1);
+               fatal("Failed to load key %s: %s", identity_file, ssh_err(r));
        }
        if (comment)
                printf("Key has comment '%s'\n", comment);
@@ -1291,7 +1258,7 @@ do_change_passphrase(struct passwd *pw)
        /* Save the file using the new passphrase. */
        if ((r = sshkey_save_private(private, identity_file, passphrase1,
            comment, use_new_format, new_format_cipher, rounds)) != 0) {
-               printf("Saving key \"%s\" failed: %s.\n",
+               error("Saving key \"%s\" failed: %s.",
                    identity_file, ssh_err(r));
                explicit_bzero(passphrase1, strlen(passphrase1));
                free(passphrase1);
@@ -1325,14 +1292,11 @@ do_print_resource_record(struct passwd *pw, char *fname, char *hname)
        if (stat(fname, &st) < 0) {
                if (errno == ENOENT)
                        return 0;
-               perror(fname);
-               exit(1);
+               fatal("%s: %s", fname, strerror(errno));
        }
-       if ((r = sshkey_load_public(fname, &public, &comment)) != 0) {
-               printf("Failed to read v2 public key from \"%s\": %s.\n",
+       if ((r = sshkey_load_public(fname, &public, &comment)) != 0)
+               fatal("Failed to read v2 public key from \"%s\": %s.",
                    fname, ssh_err(r));
-               exit(1);
-       }
        export_dns_rr(hname, public, stdout, print_generic);
        sshkey_free(public);
        free(comment);
@@ -1354,18 +1318,15 @@ do_change_comment(struct passwd *pw)
 
        if (!have_identity)
                ask_filename(pw, "Enter file in which the key is");
-       if (stat(identity_file, &st) < 0) {
-               perror(identity_file);
-               exit(1);
-       }
+       if (stat(identity_file, &st) < 0)
+               fatal("%s: %s", identity_file, strerror(errno));
        if ((r = sshkey_load_private(identity_file, "",
            &private, &comment)) == 0)
                passphrase = xstrdup("");
-       else if (r != SSH_ERR_KEY_WRONG_PASSPHRASE) {
-               printf("Cannot load private key \"%s\": %s.\n",
+       else if (r != SSH_ERR_KEY_WRONG_PASSPHRASE)
+               fatal("Cannot load private key \"%s\": %s.",
                    identity_file, ssh_err(r));
-               exit(1);
-       } else {
+       else {
                if (identity_passphrase)
                        passphrase = xstrdup(identity_passphrase);
                else if (identity_new_passphrase)
@@ -1378,13 +1339,13 @@ do_change_comment(struct passwd *pw)
                    &private, &comment)) != 0) {
                        explicit_bzero(passphrase, strlen(passphrase));
                        free(passphrase);
-                       printf("Cannot load private key \"%s\": %s.\n",
+                       fatal("Cannot load private key \"%s\": %s.",
                            identity_file, ssh_err(r));
-                       exit(1);
                }
        }
+       /* XXX what about new-format keys? */
        if (private->type != KEY_RSA1) {
-               fprintf(stderr, "Comments are only supported for RSA1 keys.\n");
+               error("Comments are only supported for RSA1 keys.");
                explicit_bzero(passphrase, strlen(passphrase));
                sshkey_free(private);
                exit(1);
@@ -1407,7 +1368,7 @@ do_change_comment(struct passwd *pw)
        /* Save the file using the new passphrase. */
        if ((r = sshkey_save_private(private, identity_file, passphrase,
            new_comment, use_new_format, new_format_cipher, rounds)) != 0) {
-               printf("Saving key \"%s\" failed: %s\n",
+               error("Saving key \"%s\" failed: %s",
                    identity_file, ssh_err(r));
                explicit_bzero(passphrase, strlen(passphrase));
                free(passphrase);
@@ -1423,17 +1384,13 @@ do_change_comment(struct passwd *pw)
 
        strlcat(identity_file, ".pub", sizeof(identity_file));
        fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-       if (fd == -1) {
-               printf("Could not save your public key in %s\n", identity_file);
-               exit(1);
-       }
+       if (fd == -1)
+               fatal("Could not save your public key in %s", identity_file);
        f = fdopen(fd, "w");
-       if (f == NULL) {
-               printf("fdopen %s failed\n", identity_file);
-               exit(1);
-       }
+       if (f == NULL)
+               fatal("fdopen %s failed: %s", identity_file, strerror(errno));
        if ((r = sshkey_write(public, f)) != 0)
-               fprintf(stderr, "write key failed: %s\n", ssh_err(r));
+               fatal("write key failed: %s", ssh_err(r));
        sshkey_free(public);
        fprintf(f, " %s\n", new_comment);
        fclose(f);
@@ -1593,8 +1550,7 @@ do_ca_sign(struct passwd *pw, int argc, char **argv)
                                break;
                        /* FALLTHROUGH */
                default:
-                       fprintf(stderr, "unknown key type %s\n", key_type_name);
-                       exit(1);
+                       fatal("unknown key type %s", key_type_name);
                }
        }
 
@@ -2248,14 +2204,10 @@ main(int argc, char **argv)
 
        /* we need this for the home * directory.  */
        pw = getpwuid(getuid());
-       if (!pw) {
-               printf("No user exists for uid %lu\n", (u_long)getuid());
-               exit(1);
-       }
-       if (gethostname(hostname, sizeof(hostname)) < 0) {
-               perror("gethostname");
-               exit(1);
-       }
+       if (!pw)
+               fatal("No user exists for uid %lu", (u_long)getuid());
+       if (gethostname(hostname, sizeof(hostname)) < 0)
+               fatal("gethostname: %s", strerror(errno));
 
        /* Remaining characters: UYdw */
        while ((opt = getopt(argc, argv, "ABHLQXceghiklopquvxy"
@@ -2470,19 +2422,19 @@ main(int argc, char **argv)
 
        if (ca_key_path != NULL) {
                if (argc < 1 && !gen_krl) {
-                       printf("Too few arguments.\n");
+                       error("Too few arguments.");
                        usage();
                }
        } else if (argc > 0 && !gen_krl && !check_krl) {
-               printf("Too many arguments.\n");
+               error("Too many arguments.");
                usage();
        }
        if (change_passphrase && change_comment) {
-               printf("Can only have one of -p and -c.\n");
+               error("Can only have one of -p and -c.");
                usage();
        }
        if (print_fingerprint && (delete_host || hash_hosts)) {
-               printf("Cannot use -l with -H or -R.\n");
+               error("Cannot use -l with -H or -R.");
                usage();
        }
 #ifdef WITH_OPENSSL
@@ -2526,10 +2478,8 @@ main(int argc, char **argv)
                if (have_identity) {
                        n = do_print_resource_record(pw,
                            identity_file, rr_hostname);
-                       if (n == 0) {
-                               perror(identity_file);
-                               exit(1);
-                       }
+                       if (n == 0)
+                               fatal("%s: %s", identity_file, strerror(errno));
                        exit(0);
                } else {
 
@@ -2601,14 +2551,10 @@ main(int argc, char **argv)
        if (!quiet)
                printf("Generating public/private %s key pair.\n",
                    key_type_name);
-       if ((r = sshkey_generate(type, bits, &private)) != 0) {
-               fprintf(stderr, "key_generate failed\n");
-               exit(1);
-       }
-       if ((r = sshkey_from_private(private, &public)) != 0) {
-               fprintf(stderr, "key_from_private failed: %s\n", ssh_err(r));
-               exit(1);
-       }
+       if ((r = sshkey_generate(type, bits, &private)) != 0)
+               fatal("key_generate failed");
+       if ((r = sshkey_from_private(private, &public)) != 0)
+               fatal("key_from_private failed: %s\n", ssh_err(r));
 
        if (!have_identity)
                ask_filename(pw, "Enter file in which to save the key");
@@ -2678,7 +2624,7 @@ passphrase_again:
        /* Save the key with the given passphrase and comment. */
        if ((r = sshkey_save_private(private, identity_file, passphrase1,
            comment, use_new_format, new_format_cipher, rounds)) != 0) {
-               printf("Saving key \"%s\" failed: %s\n",
+               error("Saving key \"%s\" failed: %s",
                    identity_file, ssh_err(r));
                explicit_bzero(passphrase1, strlen(passphrase1));
                free(passphrase1);
@@ -2695,18 +2641,13 @@ passphrase_again:
                printf("Your identification has been saved in %s.\n", identity_file);
 
        strlcat(identity_file, ".pub", sizeof(identity_file));
-       fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-       if (fd == -1) {
-               printf("Could not save your public key in %s\n", identity_file);
-               exit(1);
-       }
-       f = fdopen(fd, "w");
-       if (f == NULL) {
-               printf("fdopen %s failed\n", identity_file);
-               exit(1);
-       }
+       if ((fd = open(identity_file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
+               fatal("Unable to save public key to %s: %s",
+                   identity_file, strerror(errno));
+       if ((f = fdopen(fd, "w")) == NULL)
+               fatal("fdopen %s failed: %s", identity_file, strerror(errno));
        if ((r = sshkey_write(public, f)) != 0)
-               fprintf(stderr, "write key failed: %s\n", ssh_err(r));
+               error("write key failed: %s", ssh_err(r));
        fprintf(f, " %s\n", comment);
        fclose(f);