summaryrefslogtreecommitdiff
path: root/ssh-agent.c
diff options
context:
space:
mode:
Diffstat (limited to 'ssh-agent.c')
-rw-r--r--ssh-agent.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/ssh-agent.c b/ssh-agent.c
index c3d5e5a75..9123cfe6b 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssh-agent.c,v 1.155 2007/03/19 12:16:42 dtucker Exp $ */ 1/* $OpenBSD: ssh-agent.c,v 1.159 2008/06/28 14:05:15 djm Exp $ */
2/* 2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -51,6 +51,7 @@
51 51
52#include <openssl/evp.h> 52#include <openssl/evp.h>
53#include <openssl/md5.h> 53#include <openssl/md5.h>
54#include "openbsd-compat/openssl-compat.h"
54 55
55#include <errno.h> 56#include <errno.h>
56#include <fcntl.h> 57#include <fcntl.h>
@@ -311,6 +312,7 @@ process_sign_request2(SocketEntry *e)
311 u_char *blob, *data, *signature = NULL; 312 u_char *blob, *data, *signature = NULL;
312 u_int blen, dlen, slen = 0; 313 u_int blen, dlen, slen = 0;
313 extern int datafellows; 314 extern int datafellows;
315 int odatafellows;
314 int ok = -1, flags; 316 int ok = -1, flags;
315 Buffer msg; 317 Buffer msg;
316 Key *key; 318 Key *key;
@@ -321,6 +323,7 @@ process_sign_request2(SocketEntry *e)
321 data = buffer_get_string(&e->request, &dlen); 323 data = buffer_get_string(&e->request, &dlen);
322 324
323 flags = buffer_get_int(&e->request); 325 flags = buffer_get_int(&e->request);
326 odatafellows = datafellows;
324 if (flags & SSH_AGENT_OLD_SIGNATURE) 327 if (flags & SSH_AGENT_OLD_SIGNATURE)
325 datafellows = SSH_BUG_SIGBLOB; 328 datafellows = SSH_BUG_SIGBLOB;
326 329
@@ -346,6 +349,7 @@ process_sign_request2(SocketEntry *e)
346 xfree(blob); 349 xfree(blob);
347 if (signature != NULL) 350 if (signature != NULL)
348 xfree(signature); 351 xfree(signature);
352 datafellows = odatafellows;
349} 353}
350 354
351/* shared */ 355/* shared */
@@ -457,6 +461,7 @@ static void
457process_add_identity(SocketEntry *e, int version) 461process_add_identity(SocketEntry *e, int version)
458{ 462{
459 Idtab *tab = idtab_lookup(version); 463 Idtab *tab = idtab_lookup(version);
464 Identity *id;
460 int type, success = 0, death = 0, confirm = 0; 465 int type, success = 0, death = 0, confirm = 0;
461 char *type_name, *comment; 466 char *type_name, *comment;
462 Key *k = NULL; 467 Key *k = NULL;
@@ -524,9 +529,8 @@ process_add_identity(SocketEntry *e, int version)
524 xfree(comment); 529 xfree(comment);
525 goto send; 530 goto send;
526 } 531 }
527 success = 1;
528 while (buffer_len(&e->request)) { 532 while (buffer_len(&e->request)) {
529 switch (buffer_get_char(&e->request)) { 533 switch ((type = buffer_get_char(&e->request))) {
530 case SSH_AGENT_CONSTRAIN_LIFETIME: 534 case SSH_AGENT_CONSTRAIN_LIFETIME:
531 death = time(NULL) + buffer_get_int(&e->request); 535 death = time(NULL) + buffer_get_int(&e->request);
532 break; 536 break;
@@ -534,24 +538,29 @@ process_add_identity(SocketEntry *e, int version)
534 confirm = 1; 538 confirm = 1;
535 break; 539 break;
536 default: 540 default:
537 break; 541 error("process_add_identity: "
542 "Unknown constraint type %d", type);
543 xfree(comment);
544 key_free(k);
545 goto send;
538 } 546 }
539 } 547 }
548 success = 1;
540 if (lifetime && !death) 549 if (lifetime && !death)
541 death = time(NULL) + lifetime; 550 death = time(NULL) + lifetime;
542 if (lookup_identity(k, version) == NULL) { 551 if ((id = lookup_identity(k, version)) == NULL) {
543 Identity *id = xmalloc(sizeof(Identity)); 552 id = xmalloc(sizeof(Identity));
544 id->key = k; 553 id->key = k;
545 id->comment = comment;
546 id->death = death;
547 id->confirm = confirm;
548 TAILQ_INSERT_TAIL(&tab->idlist, id, next); 554 TAILQ_INSERT_TAIL(&tab->idlist, id, next);
549 /* Increment the number of identities. */ 555 /* Increment the number of identities. */
550 tab->nentries++; 556 tab->nentries++;
551 } else { 557 } else {
552 key_free(k); 558 key_free(k);
553 xfree(comment); 559 xfree(id->comment);
554 } 560 }
561 id->comment = comment;
562 id->death = death;
563 id->confirm = confirm;
555send: 564send:
556 buffer_put_int(&e->output, 1); 565 buffer_put_int(&e->output, 1);
557 buffer_put_char(&e->output, 566 buffer_put_char(&e->output,
@@ -602,10 +611,10 @@ no_identities(SocketEntry *e, u_int type)
602 611
603#ifdef SMARTCARD 612#ifdef SMARTCARD
604static void 613static void
605process_add_smartcard_key (SocketEntry *e) 614process_add_smartcard_key(SocketEntry *e)
606{ 615{
607 char *sc_reader_id = NULL, *pin; 616 char *sc_reader_id = NULL, *pin;
608 int i, version, success = 0, death = 0, confirm = 0; 617 int i, type, version, success = 0, death = 0, confirm = 0;
609 Key **keys, *k; 618 Key **keys, *k;
610 Identity *id; 619 Identity *id;
611 Idtab *tab; 620 Idtab *tab;
@@ -614,7 +623,7 @@ process_add_smartcard_key (SocketEntry *e)
614 pin = buffer_get_string(&e->request, NULL); 623 pin = buffer_get_string(&e->request, NULL);
615 624
616 while (buffer_len(&e->request)) { 625 while (buffer_len(&e->request)) {
617 switch (buffer_get_char(&e->request)) { 626 switch ((type = buffer_get_char(&e->request))) {
618 case SSH_AGENT_CONSTRAIN_LIFETIME: 627 case SSH_AGENT_CONSTRAIN_LIFETIME:
619 death = time(NULL) + buffer_get_int(&e->request); 628 death = time(NULL) + buffer_get_int(&e->request);
620 break; 629 break;
@@ -622,7 +631,11 @@ process_add_smartcard_key (SocketEntry *e)
622 confirm = 1; 631 confirm = 1;
623 break; 632 break;
624 default: 633 default:
625 break; 634 error("process_add_smartcard_key: "
635 "Unknown constraint type %d", type);
636 xfree(sc_reader_id);
637 xfree(pin);
638 goto send;
626 } 639 }
627 } 640 }
628 if (lifetime && !death) 641 if (lifetime && !death)
@@ -948,7 +961,8 @@ after_select(fd_set *readset, fd_set *writeset)
948 buffer_ptr(&sockets[i].output), 961 buffer_ptr(&sockets[i].output),
949 buffer_len(&sockets[i].output)); 962 buffer_len(&sockets[i].output));
950 if (len == -1 && (errno == EAGAIN || 963 if (len == -1 && (errno == EAGAIN ||
951 errno == EINTR)) 964 errno == EINTR ||
965 errno == EWOULDBLOCK))
952 continue; 966 continue;
953 break; 967 break;
954 } while (1); 968 } while (1);
@@ -962,7 +976,8 @@ after_select(fd_set *readset, fd_set *writeset)
962 do { 976 do {
963 len = read(sockets[i].fd, buf, sizeof(buf)); 977 len = read(sockets[i].fd, buf, sizeof(buf));
964 if (len == -1 && (errno == EAGAIN || 978 if (len == -1 && (errno == EAGAIN ||
965 errno == EINTR)) 979 errno == EINTR ||
980 errno == EWOULDBLOCK))
966 continue; 981 continue;
967 break; 982 break;
968 } while (1); 983 } while (1);
@@ -1016,7 +1031,7 @@ check_parent_exists(void)
1016static void 1031static void
1017usage(void) 1032usage(void)
1018{ 1033{
1019 fprintf(stderr, "Usage: %s [options] [command [args ...]]\n", 1034 fprintf(stderr, "usage: %s [options] [command [arg ...]]\n",
1020 __progname); 1035 __progname);
1021 fprintf(stderr, "Options:\n"); 1036 fprintf(stderr, "Options:\n");
1022 fprintf(stderr, " -c Generate C-shell commands on stdout.\n"); 1037 fprintf(stderr, " -c Generate C-shell commands on stdout.\n");