[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.72.2.2 and 1.72.2.3

version 1.72.2.2, 2002/05/17 00:03:24 version 1.72.2.3, 2002/06/22 07:23:18
Line 66 
Line 66 
         sock_type type;          sock_type type;
         Buffer input;          Buffer input;
         Buffer output;          Buffer output;
           Buffer request;
 } SocketEntry;  } SocketEntry;
   
 u_int sockets_alloc = 0;  u_int sockets_alloc = 0;
Line 75 
Line 76 
         TAILQ_ENTRY(identity) next;          TAILQ_ENTRY(identity) next;
         Key *key;          Key *key;
         char *comment;          char *comment;
           u_int death;
 } Identity;  } Identity;
   
 typedef struct {  typedef struct {
Line 94 
Line 96 
 char socket_name[1024];  char socket_name[1024];
 char socket_dir[1024];  char socket_dir[1024];
   
   /* locking */
   int locked = 0;
   char *lock_passwd = NULL;
   
 extern char *__progname;  extern char *__progname;
   
 static void  static void
Line 115 
Line 121 
         return &idtable[version];          return &idtable[version];
 }  }
   
   static void
   free_identity(Identity *id)
   {
           key_free(id->key);
           xfree(id->comment);
           xfree(id);
   }
   
 /* return matching private key for given public key */  /* return matching private key for given public key */
 static Identity *  static Identity *
 lookup_identity(Key *key, int version)  lookup_identity(Key *key, int version)
Line 129 
Line 143 
         return (NULL);          return (NULL);
 }  }
   
 static void  
 free_identity(Identity *id)  
 {  
         key_free(id->key);  
         xfree(id->comment);  
         xfree(id);  
 }  
   
 /* send list of supported public keys to 'client' */  /* send list of supported public keys to 'client' */
 static void  static void
 process_request_identities(SocketEntry *e, int version)  process_request_identities(SocketEntry *e, int version)
Line 186 
Line 192 
         if ((challenge = BN_new()) == NULL)          if ((challenge = BN_new()) == NULL)
                 fatal("process_authentication_challenge1: BN_new failed");                  fatal("process_authentication_challenge1: BN_new failed");
   
         buffer_get_int(&e->input);                              /* ignored */          buffer_get_int(&e->request);                            /* ignored */
         buffer_get_bignum(&e->input, key->rsa->e);          buffer_get_bignum(&e->request, key->rsa->e);
         buffer_get_bignum(&e->input, key->rsa->n);          buffer_get_bignum(&e->request, key->rsa->n);
         buffer_get_bignum(&e->input, challenge);          buffer_get_bignum(&e->request, challenge);
   
         /* Only protocol 1.1 is supported */          /* Only protocol 1.1 is supported */
         if (buffer_len(&e->input) == 0)          if (buffer_len(&e->request) == 0)
                 goto failure;                  goto failure;
         buffer_get(&e->input, session_id, 16);          buffer_get(&e->request, session_id, 16);
         response_type = buffer_get_int(&e->input);          response_type = buffer_get_int(&e->request);
         if (response_type != 1)          if (response_type != 1)
                 goto failure;                  goto failure;
   
Line 251 
Line 257 
   
         datafellows = 0;          datafellows = 0;
   
         blob = buffer_get_string(&e->input, &blen);          blob = buffer_get_string(&e->request, &blen);
         data = buffer_get_string(&e->input, &dlen);          data = buffer_get_string(&e->request, &dlen);
   
         flags = buffer_get_int(&e->input);          flags = buffer_get_int(&e->request);
         if (flags & SSH_AGENT_OLD_SIGNATURE)          if (flags & SSH_AGENT_OLD_SIGNATURE)
                 datafellows = SSH_BUG_SIGBLOB;                  datafellows = SSH_BUG_SIGBLOB;
   
Line 295 
Line 301 
         switch (version) {          switch (version) {
         case 1:          case 1:
                 key = key_new(KEY_RSA1);                  key = key_new(KEY_RSA1);
                 bits = buffer_get_int(&e->input);                  bits = buffer_get_int(&e->request);
                 buffer_get_bignum(&e->input, key->rsa->e);                  buffer_get_bignum(&e->request, key->rsa->e);
                 buffer_get_bignum(&e->input, 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 %d, announced %d",                          log("Warning: identity keysize mismatch: actual %d, announced %d",
                             key_size(key), bits);                              key_size(key), bits);
                 break;                  break;
         case 2:          case 2:
                 blob = buffer_get_string(&e->input, &blen);                  blob = buffer_get_string(&e->request, &blen);
                 key = key_from_blob(blob, blen);                  key = key_from_blob(blob, blen);
                 xfree(blob);                  xfree(blob);
                 break;                  break;
Line 355 
Line 361 
         /* Send success. */          /* Send success. */
         buffer_put_int(&e->output, 1);          buffer_put_int(&e->output, 1);
         buffer_put_char(&e->output, SSH_AGENT_SUCCESS);          buffer_put_char(&e->output, SSH_AGENT_SUCCESS);
         return;  
 }  }
   
 static void  static void
   reaper(void)
   {
           Idtab *tab;
           Identity *id, *nxt;
           int version;
           u_int now = time(NULL);
   
           for (version = 1; version < 3; version++) {
                   tab = idtab_lookup(version);
                   for (id = TAILQ_FIRST(&tab->idlist); id; id = nxt) {
                           nxt = TAILQ_NEXT(id, next);
                           if (id->death != 0 && now >= id->death) {
                                   TAILQ_REMOVE(&tab->idlist, id, next);
                                   free_identity(id);
                                   tab->nentries--;
                           }
                   }
           }
   }
   
   static void
 process_add_identity(SocketEntry *e, int version)  process_add_identity(SocketEntry *e, int version)
 {  {
         Key *k = NULL;          Key *k = NULL;
         char *type_name;          char *type_name;
         char *comment;          char *comment;
         int type, success = 0;          int type, success = 0, death = 0;
         Idtab *tab = idtab_lookup(version);          Idtab *tab = idtab_lookup(version);
   
         switch (version) {          switch (version) {
         case 1:          case 1:
                 k = key_new_private(KEY_RSA1);                  k = key_new_private(KEY_RSA1);
                 buffer_get_int(&e->input);                      /* ignored */                  buffer_get_int(&e->request);                    /* ignored */
                 buffer_get_bignum(&e->input, k->rsa->n);                  buffer_get_bignum(&e->request, k->rsa->n);
                 buffer_get_bignum(&e->input, k->rsa->e);                  buffer_get_bignum(&e->request, k->rsa->e);
                 buffer_get_bignum(&e->input, k->rsa->d);                  buffer_get_bignum(&e->request, k->rsa->d);
                 buffer_get_bignum(&e->input, k->rsa->iqmp);                  buffer_get_bignum(&e->request, k->rsa->iqmp);
   
                 /* SSH and SSL have p and q swapped */                  /* SSH and SSL have p and q swapped */
                 buffer_get_bignum(&e->input, k->rsa->q);        /* p */                  buffer_get_bignum(&e->request, k->rsa->q);      /* p */
                 buffer_get_bignum(&e->input, k->rsa->p);        /* q */                  buffer_get_bignum(&e->request, k->rsa->p);      /* q */
   
                 /* Generate additional parameters */                  /* Generate additional parameters */
                 rsa_generate_additional_parameters(k->rsa);                  rsa_generate_additional_parameters(k->rsa);
                 break;                  break;
         case 2:          case 2:
                 type_name = buffer_get_string(&e->input, NULL);                  type_name = buffer_get_string(&e->request, NULL);
                 type = key_type_from_name(type_name);                  type = key_type_from_name(type_name);
                 xfree(type_name);                  xfree(type_name);
                 switch (type) {                  switch (type) {
                 case KEY_DSA:                  case KEY_DSA:
                         k = key_new_private(type);                          k = key_new_private(type);
                         buffer_get_bignum2(&e->input, k->dsa->p);                          buffer_get_bignum2(&e->request, k->dsa->p);
                         buffer_get_bignum2(&e->input, k->dsa->q);                          buffer_get_bignum2(&e->request, k->dsa->q);
                         buffer_get_bignum2(&e->input, k->dsa->g);                          buffer_get_bignum2(&e->request, k->dsa->g);
                         buffer_get_bignum2(&e->input, k->dsa->pub_key);                          buffer_get_bignum2(&e->request, k->dsa->pub_key);
                         buffer_get_bignum2(&e->input, k->dsa->priv_key);                          buffer_get_bignum2(&e->request, k->dsa->priv_key);
                         break;                          break;
                 case KEY_RSA:                  case KEY_RSA:
                         k = key_new_private(type);                          k = key_new_private(type);
                         buffer_get_bignum2(&e->input, k->rsa->n);                          buffer_get_bignum2(&e->request, k->rsa->n);
                         buffer_get_bignum2(&e->input, k->rsa->e);                          buffer_get_bignum2(&e->request, k->rsa->e);
                         buffer_get_bignum2(&e->input, k->rsa->d);                          buffer_get_bignum2(&e->request, k->rsa->d);
                         buffer_get_bignum2(&e->input, k->rsa->iqmp);                          buffer_get_bignum2(&e->request, k->rsa->iqmp);
                         buffer_get_bignum2(&e->input, k->rsa->p);                          buffer_get_bignum2(&e->request, k->rsa->p);
                         buffer_get_bignum2(&e->input, k->rsa->q);                          buffer_get_bignum2(&e->request, k->rsa->q);
   
                         /* Generate additional parameters */                          /* Generate additional parameters */
                         rsa_generate_additional_parameters(k->rsa);                          rsa_generate_additional_parameters(k->rsa);
                         break;                          break;
                 default:                  default:
                         buffer_clear(&e->input);                          buffer_clear(&e->request);
                         goto send;                          goto send;
                 }                  }
                 break;                  break;
         }          }
         comment = buffer_get_string(&e->input, NULL);          comment = buffer_get_string(&e->request, NULL);
         if (k == NULL) {          if (k == NULL) {
                 xfree(comment);                  xfree(comment);
                 goto send;                  goto send;
         }          }
         success = 1;          success = 1;
           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;
                   default:
                           break;
                   }
           }
         if (lookup_identity(k, version) == NULL) {          if (lookup_identity(k, version) == NULL) {
                 Identity *id = xmalloc(sizeof(Identity));                  Identity *id = xmalloc(sizeof(Identity));
                 id->key = k;                  id->key = k;
                 id->comment = comment;                  id->comment = comment;
                   id->death = death;
                 TAILQ_INSERT_TAIL(&tab->idlist, id, next);                  TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                 /* Increment the number of identities. */                  /* Increment the number of identities. */
                 tab->nentries++;                  tab->nentries++;
Line 437 
Line 473 
             success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);              success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);
 }  }
   
   /* XXX todo: encrypt sensitive data with passphrase */
   static void
   process_lock_agent(SocketEntry *e, int lock)
   {
           char *passwd;
           int success = 0;
   
           passwd = buffer_get_string(&e->request, NULL);
           if (locked && !lock && strcmp(passwd, lock_passwd) == 0) {
                   locked = 0;
                   memset(lock_passwd, 0, strlen(lock_passwd));
                   xfree(lock_passwd);
                   lock_passwd = NULL;
                   success = 1;
           } else if (!locked && lock) {
                   locked = 1;
                   lock_passwd = xstrdup(passwd);
                   success = 1;
           }
           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);
   }
   
   static void
   no_identities(SocketEntry *e, u_int type)
   {
           Buffer msg;
   
           buffer_init(&msg);
           buffer_put_char(&msg,
               (type == SSH_AGENTC_REQUEST_RSA_IDENTITIES) ?
               SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER);
           buffer_put_int(&msg, 0);
           buffer_put_int(&e->output, buffer_len(&msg));
           buffer_append(&e->output, buffer_ptr(&msg), buffer_len(&msg));
           buffer_free(&msg);
   }
   
 #ifdef SMARTCARD  #ifdef SMARTCARD
 static void  static void
 process_add_smartcard_key (SocketEntry *e)  process_add_smartcard_key (SocketEntry *e)
Line 448 
Line 525 
         char *sc_reader_id = NULL, *pin;          char *sc_reader_id = NULL, *pin;
         int i, version, success = 0;          int i, version, success = 0;
   
         sc_reader_id = buffer_get_string(&e->input, NULL);          sc_reader_id = buffer_get_string(&e->request, NULL);
         pin = buffer_get_string(&e->input, NULL);          pin = buffer_get_string(&e->request, NULL);
         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 466 
Line 543 
                         id = xmalloc(sizeof(Identity));                          id = xmalloc(sizeof(Identity));
                         id->key = k;                          id->key = k;
                         id->comment = xstrdup("smartcard key");                          id->comment = xstrdup("smartcard key");
                           id->death = 0;
                         TAILQ_INSERT_TAIL(&tab->idlist, id, next);                          TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                         tab->nentries++;                          tab->nentries++;
                         success = 1;                          success = 1;
Line 490 
Line 568 
         char *sc_reader_id = NULL, *pin;          char *sc_reader_id = NULL, *pin;
         int i, version, success = 0;          int i, version, success = 0;
   
         sc_reader_id = buffer_get_string(&e->input, NULL);          sc_reader_id = buffer_get_string(&e->request, NULL);
         pin = buffer_get_string(&e->input, NULL);          pin = buffer_get_string(&e->request, NULL);
         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 505 
Line 583 
                 version = k->type == KEY_RSA1 ? 1 : 2;                  version = k->type == KEY_RSA1 ? 1 : 2;
                 if ((id = lookup_identity(k, version)) != NULL) {                  if ((id = lookup_identity(k, version)) != NULL) {
                         tab = idtab_lookup(version);                          tab = idtab_lookup(version);
                         TAILQ_REMOVE(&tab->idlist, id, next);                          TAILQ_REMOVE(&tab->idlist, id, next);
                         tab->nentries--;                          tab->nentries--;
                         free_identity(id);                          free_identity(id);
                         success = 1;                          success = 1;
Line 529 
Line 607 
         u_int msg_len;          u_int msg_len;
         u_int type;          u_int type;
         u_char *cp;          u_char *cp;
   
           /* kill dead keys */
           reaper();
   
         if (buffer_len(&e->input) < 5)          if (buffer_len(&e->input) < 5)
                 return;         /* Incomplete message. */                  return;         /* Incomplete message. */
         cp = buffer_ptr(&e->input);          cp = buffer_ptr(&e->input);
Line 537 
Line 619 
                 shutdown(e->fd, SHUT_RDWR);                  shutdown(e->fd, SHUT_RDWR);
                 close(e->fd);                  close(e->fd);
                 e->type = AUTH_UNUSED;                  e->type = AUTH_UNUSED;
                   buffer_free(&e->input);
                   buffer_free(&e->output);
                   buffer_free(&e->request);
                 return;                  return;
         }          }
         if (buffer_len(&e->input) < msg_len + 4)          if (buffer_len(&e->input) < msg_len + 4)
                 return;                  return;
   
           /* move the current input to e->request */
         buffer_consume(&e->input, 4);          buffer_consume(&e->input, 4);
         type = buffer_get_char(&e->input);          buffer_clear(&e->request);
           buffer_append(&e->request, buffer_ptr(&e->input), msg_len);
           buffer_consume(&e->input, msg_len);
           type = buffer_get_char(&e->request);
   
           /* check wheter agent is locked */
           if (locked && type != SSH_AGENTC_UNLOCK) {
                   buffer_clear(&e->request);
                   switch (type) {
                   case SSH_AGENTC_REQUEST_RSA_IDENTITIES:
                   case SSH2_AGENTC_REQUEST_IDENTITIES:
                           /* send empty lists */
                           no_identities(e, type);
                           break;
                   default:
                           /* send a fail message for all other request types */
                           buffer_put_int(&e->output, 1);
                           buffer_put_char(&e->output, SSH_AGENT_FAILURE);
                   }
                   return;
           }
   
         debug("type %d", type);          debug("type %d", type);
         switch (type) {          switch (type) {
           case SSH_AGENTC_LOCK:
           case SSH_AGENTC_UNLOCK:
                   process_lock_agent(e, type == SSH_AGENTC_LOCK);
                   break;
         /* ssh1 */          /* ssh1 */
         case SSH_AGENTC_RSA_CHALLENGE:          case SSH_AGENTC_RSA_CHALLENGE:
                 process_authentication_challenge1(e);                  process_authentication_challenge1(e);
Line 554 
Line 665 
                 process_request_identities(e, 1);                  process_request_identities(e, 1);
                 break;                  break;
         case SSH_AGENTC_ADD_RSA_IDENTITY:          case SSH_AGENTC_ADD_RSA_IDENTITY:
           case SSH_AGENTC_ADD_RSA_ID_CONSTRAINED:
                 process_add_identity(e, 1);                  process_add_identity(e, 1);
                 break;                  break;
         case SSH_AGENTC_REMOVE_RSA_IDENTITY:          case SSH_AGENTC_REMOVE_RSA_IDENTITY:
Line 570 
Line 682 
                 process_request_identities(e, 2);                  process_request_identities(e, 2);
                 break;                  break;
         case SSH2_AGENTC_ADD_IDENTITY:          case SSH2_AGENTC_ADD_IDENTITY:
           case SSH2_AGENTC_ADD_ID_CONSTRAINED:
                 process_add_identity(e, 2);                  process_add_identity(e, 2);
                 break;                  break;
         case SSH2_AGENTC_REMOVE_IDENTITY:          case SSH2_AGENTC_REMOVE_IDENTITY:
Line 589 
Line 702 
         default:          default:
                 /* Unknown message.  Respond with failure. */                  /* Unknown message.  Respond with failure. */
                 error("Unknown message %d", type);                  error("Unknown message %d", type);
                 buffer_clear(&e->input);                  buffer_clear(&e->request);
                 buffer_put_int(&e->output, 1);                  buffer_put_int(&e->output, 1);
                 buffer_put_char(&e->output, SSH_AGENT_FAILURE);                  buffer_put_char(&e->output, SSH_AGENT_FAILURE);
                 break;                  break;
Line 612 
Line 725 
                         sockets[i].type = type;                          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);
                         return;                          return;
                 }                  }
         old_alloc = sockets_alloc;          old_alloc = sockets_alloc;
Line 626 
Line 740 
         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);
 }  }
   
 static int  static int
Line 723 
Line 838 
                                         sockets[i].type = AUTH_UNUSED;                                          sockets[i].type = AUTH_UNUSED;
                                         buffer_free(&sockets[i].input);                                          buffer_free(&sockets[i].input);
                                         buffer_free(&sockets[i].output);                                          buffer_free(&sockets[i].output);
                                           buffer_free(&sockets[i].request);
                                         break;                                          break;
                                 }                                  }
                                 buffer_consume(&sockets[i].output, len);                                  buffer_consume(&sockets[i].output, len);
Line 741 
Line 857 
                                         sockets[i].type = AUTH_UNUSED;                                          sockets[i].type = AUTH_UNUSED;
                                         buffer_free(&sockets[i].input);                                          buffer_free(&sockets[i].input);
                                         buffer_free(&sockets[i].output);                                          buffer_free(&sockets[i].output);
                                           buffer_free(&sockets[i].request);
                                         break;                                          break;
                                 }                                  }
                                 buffer_append(&sockets[i].input, buf, len);                                  buffer_append(&sockets[i].input, buf, len);
Line 799 
Line 916 
         fprintf(stderr, "  -s          Generate Bourne shell commands on stdout.\n");          fprintf(stderr, "  -s          Generate Bourne shell commands on stdout.\n");
         fprintf(stderr, "  -k          Kill the current agent.\n");          fprintf(stderr, "  -k          Kill the current agent.\n");
         fprintf(stderr, "  -d          Debug mode.\n");          fprintf(stderr, "  -d          Debug mode.\n");
           fprintf(stderr, "  -a socket   Bind agent socket to given name.\n");
         exit(1);          exit(1);
 }  }
   
Line 810 
Line 928 
         struct rlimit rlim;          struct rlimit rlim;
         pid_t pid;          pid_t pid;
         char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid];          char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid];
           char *agentsocket = NULL;
         extern int optind;          extern int optind;
         fd_set *readsetp = NULL, *writesetp = NULL;          fd_set *readsetp = NULL, *writesetp = NULL;
   
         SSLeay_add_all_algorithms();          SSLeay_add_all_algorithms();
   
         while ((ch = getopt(ac, av, "cdks")) != -1) {          while ((ch = getopt(ac, av, "cdksa:")) != -1) {
                 switch (ch) {                  switch (ch) {
                 case 'c':                  case 'c':
                         if (s_flag)                          if (s_flag)
Line 835 
Line 954 
                                 usage();                                  usage();
                         d_flag++;                          d_flag++;
                         break;                          break;
                   case 'a':
                           agentsocket = optarg;
                           break;
                 default:                  default:
                         usage();                          usage();
                 }                  }
Line 870 
Line 992 
                 format = c_flag ? "unsetenv %s;\n" : "unset %s;\n";                  format = c_flag ? "unsetenv %s;\n" : "unset %s;\n";
                 printf(format, SSH_AUTHSOCKET_ENV_NAME);                  printf(format, SSH_AUTHSOCKET_ENV_NAME);
                 printf(format, SSH_AGENTPID_ENV_NAME);                  printf(format, SSH_AGENTPID_ENV_NAME);
                 printf("echo Agent pid %d killed;\n", pid);                  printf("echo Agent pid %ld killed;\n", (long)pid);
                 exit(0);                  exit(0);
         }          }
         parent_pid = getpid();          parent_pid = getpid();
   
         /* Create private directory for agent socket */          if (agentsocket == NULL) {
         strlcpy(socket_dir, "/tmp/ssh-XXXXXXXX", sizeof socket_dir);                  /* Create private directory for agent socket */
         if (mkdtemp(socket_dir) == NULL) {                  strlcpy(socket_dir, "/tmp/ssh-XXXXXXXX", sizeof socket_dir);
                 perror("mkdtemp: private socket dir");                  if (mkdtemp(socket_dir) == NULL) {
                 exit(1);                          perror("mkdtemp: private socket dir");
                           exit(1);
                   }
                   snprintf(socket_name, sizeof socket_name, "%s/agent.%ld", socket_dir,
                       (long)parent_pid);
           } else {
                   /* Try to use specified agent socket */
                   socket_dir[0] = '\0';
                   strlcpy(socket_name, agentsocket, sizeof socket_name);
         }          }
         snprintf(socket_name, sizeof socket_name, "%s/agent.%d", socket_dir,  
             parent_pid);  
   
         /*          /*
          * Create socket early so it will exist before command gets run from           * Create socket early so it will exist before command gets run from
Line 914 
Line 1042 
                 format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";                  format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
                 printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,                  printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
                     SSH_AUTHSOCKET_ENV_NAME);                      SSH_AUTHSOCKET_ENV_NAME);
                 printf("echo Agent pid %d;\n", parent_pid);                  printf("echo Agent pid %ld;\n", (long)parent_pid);
                 goto skip;                  goto skip;
         }          }
         pid = fork();          pid = fork();
Line 924 
Line 1052 
         }          }
         if (pid != 0) {         /* Parent - execute the given command. */          if (pid != 0) {         /* Parent - execute the given command. */
                 close(sock);                  close(sock);
                 snprintf(pidstrbuf, sizeof pidstrbuf, "%d", pid);                  snprintf(pidstrbuf, sizeof pidstrbuf, "%ld", (long)pid);
                 if (ac == 0) {                  if (ac == 0) {
                         format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";                          format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
                         printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,                          printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
                             SSH_AUTHSOCKET_ENV_NAME);                              SSH_AUTHSOCKET_ENV_NAME);
                         printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,                          printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,
                             SSH_AGENTPID_ENV_NAME);                              SSH_AGENTPID_ENV_NAME);
                         printf("echo Agent pid %d;\n", pid);                          printf("echo Agent pid %ld;\n", (long)pid);
                         exit(0);                          exit(0);
                 }                  }
                 if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 ||                  if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 ||

Legend:
Removed from v.1.72.2.2  
changed lines
  Added in v.1.72.2.3