]> andersk Git - openssh.git/commitdiff
- [OVERVIEW README] typos; green@freebsd
authordamien <damien>
Sun, 21 Nov 1999 07:31:57 +0000 (07:31 +0000)
committerdamien <damien>
Sun, 21 Nov 1999 07:31:57 +0000 (07:31 +0000)
    - [ssh-keygen.c]
      replace xstrdup+strcat with strlcat+fixed buffer, fixes OF (bad me)
      exit if writing the key fails (no infinit loop)
      print usage() everytime we get bad options
    - [ssh-keygen.c] overflow, djm@mindrot.org
    - [sshd.c] fix sigchld race; cjc5@po.cwru.edu

ChangeLog
OVERVIEW
ssh-keygen.c
sshd.c

index 3a7b120a04835094cdaa6417ecd22271996f7064..21d6358a4636efe30e4d5178df5c374317f93f3b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
       [channels.c clientloop.c]
       SSH_CMSG_MAX_PACKET_SIZE, some clients use this, some need this, niels@
       [hope this time my ISP stays alive during commit]
-
+    - [OVERVIEW README] typos; green@freebsd
+    - [ssh-keygen.c]
+      replace xstrdup+strcat with strlcat+fixed buffer, fixes OF (bad me)
+      exit if writing the key fails (no infinit loop)
+      print usage() everytime we get bad options
+    - [ssh-keygen.c] overflow, djm@mindrot.org
+    - [sshd.c] fix sigchld race; cjc5@po.cwru.edu
+      
 19991120
  - Merged more Solaris support from Marc G. Fournier 
    <marc.fournier@acadiau.ca>
index a8b67e4e27aacd990853ca9f411f16fc64369cd0..7f34ac45bdf91af783870597ef00b27aee26008f 100644 (file)
--- a/OVERVIEW
+++ b/OVERVIEW
@@ -1,4 +1,4 @@
-This document is inteded for those who wish to read the ssh source
+This document is intended for those who wish to read the ssh source
 code.  This tries to give an overview of the structure of the code.
       
 Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>
index 5413ba6c3c3f15fa06584d7401a5088fc055bfd7..5eb6b41e26f7abcd9e16ec4aa398ef3b06180f76 100644 (file)
@@ -50,8 +50,9 @@ int quiet = 0;
 /* Flag indicating that we just want to see the key fingerprint */
 int print_fingerprint = 0;
 
-/* This is set to the identity file name if given on the command line. */
-char *identity_file = NULL;
+/* The identity file name, given on the command line or entered by the user. */
+char identity_file[1024];
+int have_identity = 0;
 
 /* This is set to the passphrase if given on the command line. */
 char *identity_passphrase = NULL;
@@ -62,51 +63,46 @@ char *identity_new_passphrase = NULL;
 /* This is set to the new comment if given on the command line. */
 char *identity_comment = NULL;
 
-/* Perform changing a passphrase.  The argument is the passwd structure
-   for the current user. */
+/* argv0 */
+extern char *__progname;
 
-char *
-get_filename(struct passwd *pw, const char *prompt)
+void
+ask_filename(struct passwd *pw, const char *prompt)
 {
-  char buf[1024], default_file[1024];
-
-  /* Read key file name. */
-  if (identity_file != NULL) {
-    return xstrdup(identity_file);
-  } else {
-    snprintf(default_file, sizeof default_file, "%s/%s",
-             pw->pw_dir, SSH_CLIENT_IDENTITY);
-    printf("%s (%s): ", prompt, default_file);
-    fflush(stdout);
-    if (fgets(buf, sizeof(buf), stdin) == NULL)
-      exit(1);
-    if (strchr(buf, '\n'))
-      *strchr(buf, '\n') = 0;
-    if (strcmp(buf, "") == 0)
-      return xstrdup(default_file);
-  }
-  return xstrdup(buf);
+  char buf[1024];
+  snprintf(identity_file, sizeof(identity_file), "%s/%s",
+           pw->pw_dir, SSH_CLIENT_IDENTITY);
+  printf("%s (%s): ", prompt, identity_file);
+  fflush(stdout);
+  if (fgets(buf, sizeof(buf), stdin) == NULL)
+    exit(1);
+  if (strchr(buf, '\n'))
+    *strchr(buf, '\n') = 0;
+  if (strcmp(buf, "") != 0)
+    strlcpy(identity_file, buf, sizeof(identity_file));
+  have_identity = 1;
 }
 
 void
 do_fingerprint(struct passwd *pw)
 {
-  char *file, *comment;
+  char *comment;
   RSA *public_key;
   struct stat st;
 
-  file = get_filename(pw, "Enter file in which the key is");
-  if (stat(file, &st) < 0)
+  if (!have_identity)
+    ask_filename(pw, "Enter file in which the key is");
+  if (stat(identity_file, &st) < 0)
     {
-      perror(file);
+      perror(identity_file);
       exit(1);
     }
   public_key = RSA_new();
-  if (!load_public_key(file, public_key, &comment)) {
+  if (!load_public_key(identity_file, public_key, &comment)) {
     char *cp, line[1024];
     BIGNUM *e, *n;
     int dummy, invalid = 0;
-    FILE *f = fopen(file, "r");
+    FILE *f = fopen(identity_file, "r");
     n = BN_new();
     e = BN_new();
     if (f && fgets(line, sizeof(line), f)) {
@@ -123,7 +119,7 @@ do_fingerprint(struct passwd *pw)
       invalid = 1;
     }
     if (invalid) {
-      printf("%s is not a valid key file.\n", file);
+      printf("%s is not a valid key file.\n", identity_file);
       BN_free(e);
       BN_free(n);
       exit(1);
@@ -137,29 +133,32 @@ do_fingerprint(struct passwd *pw)
   exit(0);
 }
 
+/* Perform changing a passphrase.  The argument is the passwd structure
+   for the current user. */
 
 void
 do_change_passphrase(struct passwd *pw)
 {
-  char *file, *comment;
+  char *comment;
   char *old_passphrase, *passphrase1, *passphrase2;
   struct stat st;
   RSA *private_key;
 
-  file = get_filename(pw, "Enter file in which the key is");
+  if (!have_identity)
+    ask_filename(pw, "Enter file in which the key is");
   /* Check if the file exists. */
-  if (stat(file, &st) < 0)
+  if (stat(identity_file, &st) < 0)
     {
-      perror(file);
+      perror(identity_file);
       exit(1);
     }
   
   /* Try to load the public key from the file the verify that it is
      readable and of the proper format. */
   public_key = RSA_new();
-  if (!load_public_key(file, public_key, NULL))
+  if (!load_public_key(identity_file, public_key, NULL))
     {
-      printf("%s is not a valid key file.\n", file);
+      printf("%s is not a valid key file.\n", identity_file);
       exit(1);
     }
   /* Clear the public key since we are just about to load the whole file. */
@@ -167,14 +166,14 @@ do_change_passphrase(struct passwd *pw)
 
   /* Try to load the file with empty passphrase. */
   private_key = RSA_new();
-  if (!load_private_key(file, "", private_key, &comment)) {
+  if (!load_private_key(identity_file, "", private_key, &comment)) {
     /* Read passphrase from the user. */
     if (identity_passphrase)
       old_passphrase = xstrdup(identity_passphrase);
     else
       old_passphrase = read_passphrase("Enter old passphrase: ", 1);
     /* Try to load using the passphrase. */
-    if (!load_private_key(file, old_passphrase, private_key, &comment))
+    if (!load_private_key(identity_file, old_passphrase, private_key, &comment))
       {
        memset(old_passphrase, 0, strlen(old_passphrase));
        xfree(old_passphrase);
@@ -215,10 +214,10 @@ do_change_passphrase(struct passwd *pw)
     }
 
   /* Save the file using the new passphrase. */
-  if (!save_private_key(file, passphrase1, private_key, comment))
+  if (!save_private_key(identity_file, passphrase1, private_key, comment))
     {
       printf("Saving the key failed: %s: %s.\n",
-            file, strerror(errno));
+            identity_file, strerror(errno));
       memset(passphrase1, 0, strlen(passphrase1));
       xfree(passphrase1);
       RSA_free(private_key);
@@ -240,33 +239,34 @@ do_change_passphrase(struct passwd *pw)
 void
 do_change_comment(struct passwd *pw)
 {
-  char new_comment[1024], *file, *comment;
+  char new_comment[1024], *comment;
   RSA *private_key;
   char *passphrase;
   struct stat st;
   FILE *f;
   char *tmpbuf;
 
-  file = get_filename(pw, "Enter file in which the key is");
+  if (!have_identity)
+    ask_filename(pw, "Enter file in which the key is");
   /* Check if the file exists. */
-  if (stat(file, &st) < 0)
+  if (stat(identity_file, &st) < 0)
     {
-      perror(file);
+      perror(identity_file);
       exit(1);
     }
   
   /* Try to load the public key from the file the verify that it is
      readable and of the proper format. */
   public_key = RSA_new();
-  if (!load_public_key(file, public_key, NULL))
+  if (!load_public_key(identity_file, public_key, NULL))
     {
-      printf("%s is not a valid key file.\n", file);
+      printf("%s is not a valid key file.\n", identity_file);
       exit(1);
     }
 
   private_key = RSA_new();
   /* Try to load the file with empty passphrase. */
-  if (load_private_key(file, "", private_key, &comment))
+  if (load_private_key(identity_file, "", private_key, &comment))
     passphrase = xstrdup("");
   else
     {
@@ -279,7 +279,7 @@ do_change_comment(struct passwd *pw)
        else
          passphrase = read_passphrase("Enter passphrase: ", 1);
       /* Try to load using the passphrase. */
-      if (!load_private_key(file, passphrase, private_key, &comment))
+      if (!load_private_key(identity_file, passphrase, private_key, &comment))
        {
          memset(passphrase, 0, strlen(passphrase));
          xfree(passphrase);
@@ -310,10 +310,10 @@ do_change_comment(struct passwd *pw)
     }
       
   /* Save the file using the new passphrase. */
-  if (!save_private_key(file, passphrase, private_key, new_comment))
+  if (!save_private_key(identity_file, passphrase, private_key, new_comment))
     {
       printf("Saving the key failed: %s: %s.\n",
-            file, strerror(errno));
+            identity_file, strerror(errno));
       memset(passphrase, 0, strlen(passphrase));
       xfree(passphrase);
       RSA_free(private_key);
@@ -328,11 +328,11 @@ do_change_comment(struct passwd *pw)
 
   /* Save the public key in text format in a file with the same name but
      .pub appended. */
-  strcat(file, ".pub");
-  f = fopen(file, "w");
+  strlcat(identity_file, ".pub", sizeof(identity_file));
+  f = fopen(identity_file, "w");
   if (!f)
     {
-      printf("Could not save your public key in %s\n", file);
+      printf("Could not save your public key in %s\n", identity_file);
       exit(1);
     }
   fprintf(f, "%d ", BN_num_bits(public_key->n));
@@ -350,6 +350,14 @@ do_change_comment(struct passwd *pw)
   exit(0);
 }
 
+void
+usage(void)
+{
+  printf("ssh-keygen version %s\n", SSH_VERSION);
+  printf("Usage: %s [-b bits] [-p] [-c] [-f file] [-P pass] [-N new-pass] [-C comment]\n", __progname);
+  exit(1);
+}
+
 /* Main program for key management. */
 
 int
@@ -357,7 +365,7 @@ main(int ac, char **av)
 {
   char buf[16384], buf2[1024], *passphrase1, *passphrase2;
   struct passwd *pw;
-  char *file, *tmpbuf;
+  char *tmpbuf;
   int opt;
   struct stat st;
   FILE *f;
@@ -416,7 +424,8 @@ main(int ac, char **av)
          break;
 
        case 'f':
-         identity_file = optarg;
+         strlcpy(identity_file, optarg, sizeof(identity_file));
+         have_identity = 1;
          break;
          
        case 'P':
@@ -437,20 +446,18 @@ main(int ac, char **av)
 
        case '?':
        default:
-         printf("ssh-keygen version %s\n", SSH_VERSION);
-         printf("Usage: %s [-b bits] [-p] [-c] [-f file] [-P pass] [-N new-pass] [-C comment]\n", av[0]);
-         exit(1);
+         usage();
        }
     }
   if (optind < ac)
     {
       printf("Too many arguments.\n");
-      exit(1);
+      usage();
     }
   if (change_passphrase && change_comment)
     {
       printf("Can only have one of -p and -c.\n");
-      exit(1);
+      usage();
     }
 
   if (print_fingerprint)
@@ -476,14 +483,13 @@ main(int ac, char **av)
   public_key = RSA_new();
   rsa_generate_key(private_key, public_key, bits);
 
- ask_file_again:
-
-  file = get_filename(pw, "Enter file in which to save the key");
+  if (!have_identity)
+    ask_filename(pw, "Enter file in which to save the key");
 
   /* If the file aready exists, ask the user to confirm. */
-  if (stat(file, &st) >= 0)
+  if (stat(identity_file, &st) >= 0)
     {
-      printf("%s already exists.\n", file);
+      printf("%s already exists.\n", identity_file);
       printf("Overwrite (y/n)? ");
       fflush(stdout);
       if (fgets(buf2, sizeof(buf2), stdin) == NULL)
@@ -536,14 +542,13 @@ main(int ac, char **av)
     }
 
   /* Save the key with the given passphrase and comment. */
-  if (!save_private_key(file, passphrase1, private_key, buf2))
+  if (!save_private_key(identity_file, passphrase1, private_key, buf2))
     {
       printf("Saving the key failed: %s: %s.\n",
-            file, strerror(errno));
+            identity_file, strerror(errno));
       memset(passphrase1, 0, strlen(passphrase1));
       xfree(passphrase1);
-      xfree(file);
-      goto ask_file_again;
+      exit(1);
     }
   /* Clear the passphrase. */
   memset(passphrase1, 0, strlen(passphrase1));
@@ -554,7 +559,7 @@ main(int ac, char **av)
   arc4random_stir();
 
   if (!quiet)
-    printf("Your identification has been saved in %s.\n", file);
+    printf("Your identification has been saved in %s.\n", identity_file);
 
   /* Display the public key on the screen. */
   if (!quiet) {
@@ -570,12 +575,11 @@ main(int ac, char **av)
 
   /* Save the public key in text format in a file with the same name but
      .pub appended. */
-  file = xrealloc(file, strlen(file) + 5);
-  strcat(file, ".pub");
-  f = fopen(file, "w");
+  strlcat(identity_file, ".pub", sizeof(identity_file));
+  f = fopen(identity_file, "w");
   if (!f)
     {
-      printf("Could not save your public key in %s\n", file);
+      printf("Could not save your public key in %s\n", identity_file);
       exit(1);
     }
   fprintf(f, "%d ", BN_num_bits(public_key->n));
@@ -588,7 +592,7 @@ main(int ac, char **av)
   fclose(f);
 
   if (!quiet)
-    printf("Your public key has been saved in %s\n", file);
+    printf("Your public key has been saved in %s\n", identity_file);
   
   exit(0);
 }
diff --git a/sshd.c b/sshd.c
index 95a820de95a7a14aaeb590c80e6b330673aa65d3..9bbf28b21abd50dfc5dd7ebe5f817af59fdf8a29 100644 (file)
--- a/sshd.c
+++ b/sshd.c
@@ -316,7 +316,10 @@ void main_sigchld_handler(int sig)
 {
   int save_errno = errno;
   int status;
-  wait(&status);
+
+  while (waitpid(-1, &status, WNOHANG) > 0)
+       ;
+
   signal(SIGCHLD, main_sigchld_handler);
   errno = save_errno;
 }
This page took 0.055015 seconds and 5 git commands to generate.