]> andersk Git - openssh.git/blobdiff - ssh-agent.c
- stevesk@cvs.openbsd.org 2002/08/22 19:27:53
[openssh.git] / ssh-agent.c
index 536db2de00fadca267c5eb436767a85c07ac363a..cdc236d99cbb30e2d5f4a1b09d281a8222b2d74c 100644 (file)
@@ -35,7 +35,7 @@
 
 #include "includes.h"
 #include "openbsd-compat/fake-queue.h"
-RCSID("$OpenBSD: ssh-agent.c,v 1.94 2002/06/15 01:27:48 markus Exp $");
+RCSID("$OpenBSD: ssh-agent.c,v 1.101 2002/08/22 19:27:53 stevesk Exp $");
 
 #include <openssl/evp.h>
 #include <openssl/md5.h>
@@ -106,10 +106,23 @@ extern char *__progname;
 char *__progname;
 #endif
 
+static void
+close_socket(SocketEntry *e)
+{
+       shutdown(e->fd, SHUT_RDWR);
+       close(e->fd);
+       e->fd = -1;
+       e->type = AUTH_UNUSED;
+       buffer_free(&e->input);
+       buffer_free(&e->output);
+       buffer_free(&e->request);
+}
+
 static void
 idtab_init(void)
 {
        int i;
+
        for (i = 0; i <=2; i++) {
                TAILQ_INIT(&idtable[i].idlist);
                idtable[i].nentries = 0;
@@ -152,8 +165,8 @@ static void
 process_request_identities(SocketEntry *e, int version)
 {
        Idtab *tab = idtab_lookup(version);
-       Buffer msg;
        Identity *id;
+       Buffer msg;
 
        buffer_init(&msg);
        buffer_put_char(&msg, (version == 1) ?
@@ -182,21 +195,21 @@ process_request_identities(SocketEntry *e, int version)
 static void
 process_authentication_challenge1(SocketEntry *e)
 {
-       Identity *id;
-       Key *key;
+       u_char buf[32], mdbuf[16], session_id[16];
+       u_int response_type;
        BIGNUM *challenge;
+       Identity *id;
        int i, len;
        Buffer msg;
        MD5_CTX md;
-       u_char buf[32], mdbuf[16], session_id[16];
-       u_int response_type;
+       Key *key;
 
        buffer_init(&msg);
        key = key_new(KEY_RSA1);
        if ((challenge = BN_new()) == NULL)
                fatal("process_authentication_challenge1: BN_new failed");
 
-       buffer_get_int(&e->request);                            /* ignored */
+       (void) buffer_get_int(&e->request);                     /* ignored */
        buffer_get_bignum(&e->request, key->rsa->e);
        buffer_get_bignum(&e->request, key->rsa->n);
        buffer_get_bignum(&e->request, challenge);
@@ -251,13 +264,12 @@ send:
 static void
 process_sign_request2(SocketEntry *e)
 {
-       extern int datafellows;
-       Key *key;
        u_char *blob, *data, *signature = NULL;
        u_int blen, dlen, slen = 0;
-       int flags;
+       extern int datafellows;
+       int ok = -1, flags;
        Buffer msg;
-       int ok = -1;
+       Key *key;
 
        datafellows = 0;
 
@@ -296,11 +308,10 @@ process_sign_request2(SocketEntry *e)
 static void
 process_remove_identity(SocketEntry *e, int version)
 {
+       u_int blen, bits;
+       int success = 0;
        Key *key = NULL;
        u_char *blob;
-       u_int blen;
-       u_int bits;
-       int success = 0;
 
        switch (version) {
        case 1:
@@ -310,7 +321,7 @@ process_remove_identity(SocketEntry *e, int version)
                buffer_get_bignum(&e->request, key->rsa->n);
 
                if (bits != key_size(key))
-                       log("Warning: identity keysize mismatch: actual %d, announced %d",
+                       log("Warning: identity keysize mismatch: actual %u, announced %u",
                            key_size(key), bits);
                break;
        case 2:
@@ -365,16 +376,15 @@ process_remove_all_identities(SocketEntry *e, int version)
        /* Send success. */
        buffer_put_int(&e->output, 1);
        buffer_put_char(&e->output, SSH_AGENT_SUCCESS);
-       return;
 }
 
 static void
 reaper(void)
 {
-       Idtab *tab;
+       u_int now = time(NULL);
        Identity *id, *nxt;
        int version;
-       u_int now = time(NULL);
+       Idtab *tab;
 
        for (version = 1; version < 3; version++) {
                tab = idtab_lookup(version);
@@ -392,16 +402,15 @@ reaper(void)
 static void
 process_add_identity(SocketEntry *e, int version)
 {
-       Key *k = NULL;
-       char *type_name;
-       char *comment;
-       int type, success = 0, death = 0;
        Idtab *tab = idtab_lookup(version);
+       int type, success = 0, death = 0;
+       char *type_name, *comment;
+       Key *k = NULL;
 
        switch (version) {
        case 1:
                k = key_new_private(KEY_RSA1);
-               buffer_get_int(&e->request);                    /* ignored */
+               (void) buffer_get_int(&e->request);             /* ignored */
                buffer_get_bignum(&e->request, k->rsa->n);
                buffer_get_bignum(&e->request, k->rsa->e);
                buffer_get_bignum(&e->request, k->rsa->d);
@@ -482,8 +491,8 @@ send:
 static void
 process_lock_agent(SocketEntry *e, int lock)
 {
-       char *passwd;
        int success = 0;
+       char *passwd;
 
        passwd = buffer_get_string(&e->request, NULL);
        if (locked && !lock && strcmp(passwd, lock_passwd) == 0) {
@@ -499,11 +508,10 @@ process_lock_agent(SocketEntry *e, int lock)
        }
        memset(passwd, 0, strlen(passwd));
        xfree(passwd);
+
        buffer_put_int(&e->output, 1);
        buffer_put_char(&e->output,
            success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);
-       return;
 }
 
 static void
@@ -525,11 +533,11 @@ no_identities(SocketEntry *e, u_int type)
 static void
 process_add_smartcard_key (SocketEntry *e)
 {
-       Identity *id;
-       Idtab *tab;
-       Key **keys, *k;
        char *sc_reader_id = NULL, *pin;
        int i, version, success = 0;
+       Key **keys, *k;
+       Identity *id;
+       Idtab *tab;
 
        sc_reader_id = buffer_get_string(&e->request, NULL);
        pin = buffer_get_string(&e->request, NULL);
@@ -568,11 +576,11 @@ send:
 static void
 process_remove_smartcard_key(SocketEntry *e)
 {
-       Identity *id;
-       Idtab *tab;
-       Key **keys, *k = NULL;
        char *sc_reader_id = NULL, *pin;
        int i, version, success = 0;
+       Key **keys, *k = NULL;
+       Identity *id;
+       Idtab *tab;
 
        sc_reader_id = buffer_get_string(&e->request, NULL);
        pin = buffer_get_string(&e->request, NULL);
@@ -610,8 +618,7 @@ send:
 static void
 process_message(SocketEntry *e)
 {
-       u_int msg_len;
-       u_int type;
+       u_int msg_len, type;
        u_char *cp;
 
        /* kill dead keys */
@@ -622,12 +629,7 @@ process_message(SocketEntry *e)
        cp = buffer_ptr(&e->input);
        msg_len = GET_32BIT(cp);
        if (msg_len > 256 * 1024) {
-               shutdown(e->fd, SHUT_RDWR);
-               close(e->fd);
-               e->type = AUTH_UNUSED;
-               buffer_free(&e->input);
-               buffer_free(&e->output);
-               buffer_free(&e->request);
+               close_socket(e);
                return;
        }
        if (buffer_len(&e->input) < msg_len + 4)
@@ -719,6 +721,7 @@ static void
 new_socket(sock_type type, int fd)
 {
        u_int i, old_alloc;
+
        if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
                error("fcntl O_NONBLOCK: %s", strerror(errno));
 
@@ -803,11 +806,11 @@ prepare_select(fd_set **fdrp, fd_set **fdwp, int *fdl, int *nallocp)
 static void
 after_select(fd_set *readset, fd_set *writeset)
 {
-       u_int i;
-       int len, sock;
+       struct sockaddr_un sunaddr;
        socklen_t slen;
        char buf[1024];
-       struct sockaddr_un sunaddr;
+       int len, sock;
+       u_int i;
 
        for (i = 0; i < sockets_alloc; i++)
                switch (sockets[i].type) {
@@ -839,12 +842,7 @@ after_select(fd_set *readset, fd_set *writeset)
                                        break;
                                } while (1);
                                if (len <= 0) {
-                                       shutdown(sockets[i].fd, SHUT_RDWR);
-                                       close(sockets[i].fd);
-                                       sockets[i].type = AUTH_UNUSED;
-                                       buffer_free(&sockets[i].input);
-                                       buffer_free(&sockets[i].output);
-                                       buffer_free(&sockets[i].request);
+                                       close_socket(&sockets[i]);
                                        break;
                                }
                                buffer_consume(&sockets[i].output, len);
@@ -858,12 +856,7 @@ after_select(fd_set *readset, fd_set *writeset)
                                        break;
                                } while (1);
                                if (len <= 0) {
-                                       shutdown(sockets[i].fd, SHUT_RDWR);
-                                       close(sockets[i].fd);
-                                       sockets[i].type = AUTH_UNUSED;
-                                       buffer_free(&sockets[i].input);
-                                       buffer_free(&sockets[i].output);
-                                       buffer_free(&sockets[i].request);
+                                       close_socket(&sockets[i]);
                                        break;
                                }
                                buffer_append(&sockets[i].input, buf, len);
@@ -930,6 +923,8 @@ int
 main(int ac, char **av)
 {
        int sock, c_flag = 0, d_flag = 0, k_flag = 0, s_flag = 0, ch, nalloc;
+       char *shell, *format, *pidstr, *agentsocket = NULL;
+       fd_set *readsetp = NULL, *writesetp = NULL;
        struct sockaddr_un sunaddr;
 #ifdef HAVE_SETRLIMIT
        struct rlimit rlim;
@@ -937,11 +932,14 @@ main(int ac, char **av)
 #ifdef HAVE_CYGWIN
        int prev_mask;
 #endif
-       pid_t pid;
-       char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid];
-       char *agentsocket = NULL;
        extern int optind;
-       fd_set *readsetp = NULL, *writesetp = NULL;
+       extern char *optarg;
+       pid_t pid;
+       char pidstrbuf[1 + 3 * sizeof pid];
+
+       /* drop */
+       setegid(getgid());
+       setgid(getgid());
 
        SSLeay_add_all_algorithms();
 
@@ -949,11 +947,7 @@ main(int ac, char **av)
        init_rng();
        seed_rng();
 
-#ifdef __GNU_LIBRARY__
-       while ((ch = getopt(ac, av, "+cdksa:")) != -1) {
-#else /* __GNU_LIBRARY__ */
        while ((ch = getopt(ac, av, "cdksa:")) != -1) {
-#endif /* __GNU_LIBRARY__ */
                switch (ch) {
                case 'c':
                        if (s_flag)
@@ -1056,7 +1050,7 @@ main(int ac, char **av)
 #ifdef HAVE_CYGWIN
        umask(prev_mask);
 #endif
-       if (listen(sock, 5) < 0) {
+       if (listen(sock, 128) < 0) {
                perror("listen");
                cleanup_exit(1);
        }
This page took 0.314983 seconds and 4 git commands to generate.