diff options
Diffstat (limited to 'ssh-agent.c')
-rw-r--r-- | ssh-agent.c | 49 |
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 | |||
457 | process_add_identity(SocketEntry *e, int version) | 461 | process_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; | ||
555 | send: | 564 | send: |
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 |
604 | static void | 613 | static void |
605 | process_add_smartcard_key (SocketEntry *e) | 614 | process_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) | |||
1016 | static void | 1031 | static void |
1017 | usage(void) | 1032 | usage(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"); |