[BACK]Return to ssh-agent.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/ssh-agent.c between version 1.108 and 1.108.2.2

version 1.108, 2003/03/13 11:44:50 version 1.108.2.2, 2004/03/04 18:18:16
Line 175 
Line 175 
         p = read_passphrase(prompt, RP_ALLOW_EOF);          p = read_passphrase(prompt, RP_ALLOW_EOF);
         if (p != NULL) {          if (p != NULL) {
                 /*                  /*
                  * Accept empty responses and responses consisting                   * Accept empty responses and responses consisting
                  * of the word "yes" as affirmative.                   * of the word "yes" as affirmative.
                  */                   */
                 if (*p == '\0' || *p == '\n' || strcasecmp(p, "yes") == 0)                  if (*p == '\0' || *p == '\n' || strcasecmp(p, "yes") == 0)
Line 257 
Line 257 
                 /* The response is MD5 of decrypted challenge plus session id. */                  /* The response is MD5 of decrypted challenge plus session id. */
                 len = BN_num_bytes(challenge);                  len = BN_num_bytes(challenge);
                 if (len <= 0 || len > 32) {                  if (len <= 0 || len > 32) {
                         log("process_authentication_challenge: bad challenge length %d", len);                          logit("process_authentication_challenge: bad challenge length %d", len);
                         goto failure;                          goto failure;
                 }                  }
                 memset(buf, 0, 32);                  memset(buf, 0, 32);
Line 346 
Line 346 
                 buffer_get_bignum(&e->request, key->rsa->n);                  buffer_get_bignum(&e->request, key->rsa->n);
   
                 if (bits != key_size(key))                  if (bits != key_size(key))
                         log("Warning: identity keysize mismatch: actual %u, announced %u",                          logit("Warning: identity keysize mismatch: actual %u, announced %u",
                             key_size(key), bits);                              key_size(key), bits);
                 break;                  break;
         case 2:          case 2:
Line 576 
Line 576 
 process_add_smartcard_key (SocketEntry *e)  process_add_smartcard_key (SocketEntry *e)
 {  {
         char *sc_reader_id = NULL, *pin;          char *sc_reader_id = NULL, *pin;
         int i, version, success = 0;          int i, version, success = 0, death = 0, confirm = 0;
         Key **keys, *k;          Key **keys, *k;
         Identity *id;          Identity *id;
         Idtab *tab;          Idtab *tab;
   
         sc_reader_id = buffer_get_string(&e->request, NULL);          sc_reader_id = buffer_get_string(&e->request, NULL);
         pin = buffer_get_string(&e->request, NULL);          pin = buffer_get_string(&e->request, NULL);
   
           while (buffer_len(&e->request)) {
                   switch (buffer_get_char(&e->request)) {
                   case SSH_AGENT_CONSTRAIN_LIFETIME:
                           death = time(NULL) + buffer_get_int(&e->request);
                           break;
                   case SSH_AGENT_CONSTRAIN_CONFIRM:
                           confirm = 1;
                           break;
                   default:
                           break;
                   }
           }
           if (lifetime && !death)
                   death = time(NULL) + lifetime;
   
         keys = sc_get_keys(sc_reader_id, pin);          keys = sc_get_keys(sc_reader_id, pin);
         xfree(sc_reader_id);          xfree(sc_reader_id);
         xfree(pin);          xfree(pin);
Line 598 
Line 614 
                 if (lookup_identity(k, version) == NULL) {                  if (lookup_identity(k, version) == NULL) {
                         id = xmalloc(sizeof(Identity));                          id = xmalloc(sizeof(Identity));
                         id->key = k;                          id->key = k;
                         id->comment = xstrdup("smartcard key");                          id->comment = sc_get_key_label(k);
                         id->death = 0;                          id->death = death;
                         id->confirm = 0;                          id->confirm = confirm;
                         TAILQ_INSERT_TAIL(&tab->idlist, id, next);                          TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                         tab->nentries++;                          tab->nentries++;
                         success = 1;                          success = 1;
Line 744 
Line 760 
                 break;                  break;
 #ifdef SMARTCARD  #ifdef SMARTCARD
         case SSH_AGENTC_ADD_SMARTCARD_KEY:          case SSH_AGENTC_ADD_SMARTCARD_KEY:
           case SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED:
                 process_add_smartcard_key(e);                  process_add_smartcard_key(e);
                 break;                  break;
         case SSH_AGENTC_REMOVE_SMARTCARD_KEY:          case SSH_AGENTC_REMOVE_SMARTCARD_KEY:
Line 763 
Line 780 
 static void  static void
 new_socket(sock_type type, int fd)  new_socket(sock_type type, int fd)
 {  {
         u_int i, old_alloc;          u_int i, old_alloc, new_alloc;
   
         if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)          if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
                 error("fcntl O_NONBLOCK: %s", strerror(errno));                  error("fcntl O_NONBLOCK: %s", strerror(errno));
Line 774 
Line 791 
         for (i = 0; i < sockets_alloc; i++)          for (i = 0; i < sockets_alloc; i++)
                 if (sockets[i].type == AUTH_UNUSED) {                  if (sockets[i].type == AUTH_UNUSED) {
                         sockets[i].fd = fd;                          sockets[i].fd = fd;
                         sockets[i].type = type;  
                         buffer_init(&sockets[i].input);                          buffer_init(&sockets[i].input);
                         buffer_init(&sockets[i].output);                          buffer_init(&sockets[i].output);
                         buffer_init(&sockets[i].request);                          buffer_init(&sockets[i].request);
                           sockets[i].type = type;
                         return;                          return;
                 }                  }
         old_alloc = sockets_alloc;          old_alloc = sockets_alloc;
         sockets_alloc += 10;          new_alloc = sockets_alloc + 10;
         if (sockets)          if (sockets)
                 sockets = xrealloc(sockets, sockets_alloc * sizeof(sockets[0]));                  sockets = xrealloc(sockets, new_alloc * sizeof(sockets[0]));
         else          else
                 sockets = xmalloc(sockets_alloc * sizeof(sockets[0]));                  sockets = xmalloc(new_alloc * sizeof(sockets[0]));
         for (i = old_alloc; i < sockets_alloc; i++)          for (i = old_alloc; i < new_alloc; i++)
                 sockets[i].type = AUTH_UNUSED;                  sockets[i].type = AUTH_UNUSED;
         sockets[old_alloc].type = type;          sockets_alloc = new_alloc;
         sockets[old_alloc].fd = fd;          sockets[old_alloc].fd = fd;
         buffer_init(&sockets[old_alloc].input);          buffer_init(&sockets[old_alloc].input);
         buffer_init(&sockets[old_alloc].output);          buffer_init(&sockets[old_alloc].output);
         buffer_init(&sockets[old_alloc].request);          buffer_init(&sockets[old_alloc].request);
           sockets[old_alloc].type = type;
 }  }
   
 static int  static int
Line 927 
Line 945 
 }  }
   
 static void  static void
 cleanup_socket(void *p)  cleanup_socket(void)
 {  {
         if (socket_name[0])          if (socket_name[0])
                 unlink(socket_name);                  unlink(socket_name);
Line 935 
Line 953 
                 rmdir(socket_dir);                  rmdir(socket_dir);
 }  }
   
 static void  void
 cleanup_exit(int i)  cleanup_exit(int i)
 {  {
         cleanup_socket(NULL);          cleanup_socket();
         exit(i);          _exit(i);
 }  }
   
 static void  static void
 cleanup_handler(int sig)  cleanup_handler(int sig)
 {  {
         cleanup_socket(NULL);          cleanup_socket();
         _exit(2);          _exit(2);
 }  }
   
Line 1069 
Line 1087 
   
         if (agentsocket == NULL) {          if (agentsocket == NULL) {
                 /* Create private directory for agent socket */                  /* Create private directory for agent socket */
                 strlcpy(socket_dir, "/tmp/ssh-XXXXXXXX", sizeof socket_dir);                  strlcpy(socket_dir, "/tmp/ssh-XXXXXXXXXX", sizeof socket_dir);
                 if (mkdtemp(socket_dir) == NULL) {                  if (mkdtemp(socket_dir) == NULL) {
                         perror("mkdtemp: private socket dir");                          perror("mkdtemp: private socket dir");
                         exit(1);                          exit(1);
Line 1098 
Line 1116 
                 perror("bind");                  perror("bind");
                 cleanup_exit(1);                  cleanup_exit(1);
         }          }
         if (listen(sock, 128) < 0) {          if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
                 perror("listen");                  perror("listen");
                 cleanup_exit(1);                  cleanup_exit(1);
         }          }
Line 1167 
Line 1185 
         }          }
   
 skip:  skip:
         fatal_add_cleanup(cleanup_socket, NULL);  
         new_socket(AUTH_SOCKET, sock);          new_socket(AUTH_SOCKET, sock);
         if (ac > 0) {          if (ac > 0) {
                 signal(SIGALRM, check_parent_exists);                  signal(SIGALRM, check_parent_exists);

Legend:
Removed from v.1.108  
changed lines
  Added in v.1.108.2.2