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

Diff for /src/usr.bin/ssh/servconf.c between version 1.53 and 1.53.2.3

version 1.53, 2000/10/14 12:12:09 version 1.53.2.3, 2001/03/21 19:46:28
Line 12 
Line 12 
 #include "includes.h"  #include "includes.h"
 RCSID("$OpenBSD$");  RCSID("$OpenBSD$");
   
   #ifdef KRB4
   #include <krb.h>
   #endif
   #ifdef AFS
   #include <kafs.h>
   #endif
   
 #include "ssh.h"  #include "ssh.h"
   #include "log.h"
 #include "servconf.h"  #include "servconf.h"
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "compat.h"  #include "compat.h"
   #include "pathnames.h"
   #include "tildexpand.h"
   #include "misc.h"
   #include "cipher.h"
   #include "kex.h"
   #include "mac.h"
   
 /* add listen address */  /* add listen address */
 void add_listen_addr(ServerOptions *options, char *addr);  void add_listen_addr(ServerOptions *options, char *addr);
   
   /* AF_UNSPEC or AF_INET or AF_INET6 */
   extern int IPv4or6;
   
 /* Initializes the server options to their default values. */  /* Initializes the server options to their default values. */
   
 void  void
Line 29 
Line 46 
         options->num_ports = 0;          options->num_ports = 0;
         options->ports_from_cmdline = 0;          options->ports_from_cmdline = 0;
         options->listen_addrs = NULL;          options->listen_addrs = NULL;
         options->host_key_file = NULL;          options->num_host_key_files = 0;
         options->host_dsa_key_file = NULL;  
         options->pid_file = NULL;          options->pid_file = NULL;
         options->server_key_bits = -1;          options->server_key_bits = -1;
         options->login_grace_time = -1;          options->login_grace_time = -1;
         options->key_regeneration_time = -1;          options->key_regeneration_time = -1;
         options->permit_root_login = -1;          options->permit_root_login = PERMIT_NOT_SET;
         options->ignore_rhosts = -1;          options->ignore_rhosts = -1;
         options->ignore_user_known_hosts = -1;          options->ignore_user_known_hosts = -1;
         options->print_motd = -1;          options->print_motd = -1;
Line 50 
Line 66 
         options->rhosts_authentication = -1;          options->rhosts_authentication = -1;
         options->rhosts_rsa_authentication = -1;          options->rhosts_rsa_authentication = -1;
         options->rsa_authentication = -1;          options->rsa_authentication = -1;
         options->dsa_authentication = -1;          options->pubkey_authentication = -1;
 #ifdef KRB4  #ifdef KRB4
         options->kerberos_authentication = -1;          options->kerberos_authentication = -1;
         options->kerberos_or_local_passwd = -1;          options->kerberos_or_local_passwd = -1;
Line 62 
Line 78 
 #endif  #endif
         options->password_authentication = -1;          options->password_authentication = -1;
         options->kbd_interactive_authentication = -1;          options->kbd_interactive_authentication = -1;
 #ifdef SKEY          options->challenge_reponse_authentication = -1;
         options->skey_authentication = -1;  
 #endif  
         options->permit_empty_passwd = -1;          options->permit_empty_passwd = -1;
         options->use_login = -1;          options->use_login = -1;
         options->allow_tcp_forwarding = -1;          options->allow_tcp_forwarding = -1;
Line 73 
Line 87 
         options->num_allow_groups = 0;          options->num_allow_groups = 0;
         options->num_deny_groups = 0;          options->num_deny_groups = 0;
         options->ciphers = NULL;          options->ciphers = NULL;
           options->macs = NULL;
         options->protocol = SSH_PROTO_UNKNOWN;          options->protocol = SSH_PROTO_UNKNOWN;
         options->gateway_ports = -1;          options->gateway_ports = -1;
         options->num_subsystems = 0;          options->num_subsystems = 0;
         options->max_startups_begin = -1;          options->max_startups_begin = -1;
         options->max_startups_rate = -1;          options->max_startups_rate = -1;
         options->max_startups = -1;          options->max_startups = -1;
           options->banner = NULL;
           options->reverse_mapping_check = -1;
 }  }
   
 void  void
 fill_default_server_options(ServerOptions *options)  fill_default_server_options(ServerOptions *options)
 {  {
           if (options->protocol == SSH_PROTO_UNKNOWN)
                   options->protocol = SSH_PROTO_1|SSH_PROTO_2;
           if (options->num_host_key_files == 0) {
                   /* fill default hostkeys for protocols */
                   if (options->protocol & SSH_PROTO_1)
                           options->host_key_files[options->num_host_key_files++] = _PATH_HOST_KEY_FILE;
                   if (options->protocol & SSH_PROTO_2)
                           options->host_key_files[options->num_host_key_files++] = _PATH_HOST_DSA_KEY_FILE;
           }
         if (options->num_ports == 0)          if (options->num_ports == 0)
                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;                  options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
         if (options->listen_addrs == NULL)          if (options->listen_addrs == NULL)
                 add_listen_addr(options, NULL);                  add_listen_addr(options, NULL);
         if (options->host_key_file == NULL)  
                 options->host_key_file = HOST_KEY_FILE;  
         if (options->host_dsa_key_file == NULL)  
                 options->host_dsa_key_file = HOST_DSA_KEY_FILE;  
         if (options->pid_file == NULL)          if (options->pid_file == NULL)
                 options->pid_file = SSH_DAEMON_PID_FILE;                  options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
         if (options->server_key_bits == -1)          if (options->server_key_bits == -1)
                 options->server_key_bits = 768;                  options->server_key_bits = 768;
         if (options->login_grace_time == -1)          if (options->login_grace_time == -1)
                 options->login_grace_time = 600;                  options->login_grace_time = 600;
         if (options->key_regeneration_time == -1)          if (options->key_regeneration_time == -1)
                 options->key_regeneration_time = 3600;                  options->key_regeneration_time = 3600;
         if (options->permit_root_login == -1)          if (options->permit_root_login == PERMIT_NOT_SET)
                 options->permit_root_login = 1;                 /* yes */                  options->permit_root_login = PERMIT_YES;
         if (options->ignore_rhosts == -1)          if (options->ignore_rhosts == -1)
                 options->ignore_rhosts = 1;                  options->ignore_rhosts = 1;
         if (options->ignore_user_known_hosts == -1)          if (options->ignore_user_known_hosts == -1)
Line 132 
Line 154 
                 options->rhosts_rsa_authentication = 0;                  options->rhosts_rsa_authentication = 0;
         if (options->rsa_authentication == -1)          if (options->rsa_authentication == -1)
                 options->rsa_authentication = 1;                  options->rsa_authentication = 1;
         if (options->dsa_authentication == -1)          if (options->pubkey_authentication == -1)
                 options->dsa_authentication = 1;                  options->pubkey_authentication = 1;
 #ifdef KRB4  #ifdef KRB4
         if (options->kerberos_authentication == -1)          if (options->kerberos_authentication == -1)
                 options->kerberos_authentication = (access(KEYFILE, R_OK) == 0);                  options->kerberos_authentication = (access(KEYFILE, R_OK) == 0);
Line 152 
Line 174 
                 options->password_authentication = 1;                  options->password_authentication = 1;
         if (options->kbd_interactive_authentication == -1)          if (options->kbd_interactive_authentication == -1)
                 options->kbd_interactive_authentication = 0;                  options->kbd_interactive_authentication = 0;
 #ifdef SKEY          if (options->challenge_reponse_authentication == -1)
         if (options->skey_authentication == -1)                  options->challenge_reponse_authentication = 1;
                 options->skey_authentication = 1;  
 #endif  
         if (options->permit_empty_passwd == -1)          if (options->permit_empty_passwd == -1)
                 options->permit_empty_passwd = 0;                  options->permit_empty_passwd = 0;
         if (options->use_login == -1)          if (options->use_login == -1)
                 options->use_login = 0;                  options->use_login = 0;
         if (options->allow_tcp_forwarding == -1)          if (options->allow_tcp_forwarding == -1)
                 options->allow_tcp_forwarding = 1;                  options->allow_tcp_forwarding = 1;
         if (options->protocol == SSH_PROTO_UNKNOWN)  
                 options->protocol = SSH_PROTO_1|SSH_PROTO_2;  
         if (options->gateway_ports == -1)          if (options->gateway_ports == -1)
                 options->gateway_ports = 0;                  options->gateway_ports = 0;
         if (options->max_startups == -1)          if (options->max_startups == -1)
Line 172 
Line 190 
                 options->max_startups_rate = 100;               /* 100% */                  options->max_startups_rate = 100;               /* 100% */
         if (options->max_startups_begin == -1)          if (options->max_startups_begin == -1)
                 options->max_startups_begin = options->max_startups;                  options->max_startups_begin = options->max_startups;
           if (options->reverse_mapping_check == -1)
                   options->reverse_mapping_check = 0;
 }  }
   
 /* Keyword tokens. */  /* Keyword tokens. */
Line 186 
Line 206 
 #ifdef AFS  #ifdef AFS
         sKerberosTgtPassing, sAFSTokenPassing,          sKerberosTgtPassing, sAFSTokenPassing,
 #endif  #endif
 #ifdef SKEY          sChallengeResponseAuthentication,
         sSkeyAuthentication,  
 #endif  
         sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,          sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,
         sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,          sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,
         sStrictModes, sEmptyPasswd, sRandomSeedFile, sKeepAlives, sCheckMail,          sStrictModes, sEmptyPasswd, sKeepAlives, sCheckMail,
         sUseLogin, sAllowTcpForwarding,          sUseLogin, sAllowTcpForwarding,
         sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,          sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
         sIgnoreUserKnownHosts, sHostDSAKeyFile, sCiphers, sProtocol, sPidFile,          sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
         sGatewayPorts, sDSAAuthentication, sXAuthLocation, sSubsystem, sMaxStartups          sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, sMaxStartups,
           sBanner, sReverseMappingCheck
 } ServerOpCodes;  } ServerOpCodes;
   
 /* Textual representation of the tokens. */  /* Textual representation of the tokens. */
Line 205 
Line 224 
 } keywords[] = {  } keywords[] = {
         { "port", sPort },          { "port", sPort },
         { "hostkey", sHostKeyFile },          { "hostkey", sHostKeyFile },
         { "hostdsakey", sHostDSAKeyFile },          { "hostdsakey", sHostKeyFile },                                 /* alias */
         { "pidfile", sPidFile },          { "pidfile", sPidFile },
         { "serverkeybits", sServerKeyBits },          { "serverkeybits", sServerKeyBits },
         { "logingracetime", sLoginGraceTime },          { "logingracetime", sLoginGraceTime },
         { "keyregenerationinterval", sKeyRegenerationTime },          { "keyregenerationinterval", sKeyRegenerationTime },
Line 216 
Line 235 
         { "rhostsauthentication", sRhostsAuthentication },          { "rhostsauthentication", sRhostsAuthentication },
         { "rhostsrsaauthentication", sRhostsRSAAuthentication },          { "rhostsrsaauthentication", sRhostsRSAAuthentication },
         { "rsaauthentication", sRSAAuthentication },          { "rsaauthentication", sRSAAuthentication },
         { "dsaauthentication", sDSAAuthentication },          { "pubkeyauthentication", sPubkeyAuthentication },
           { "dsaauthentication", sPubkeyAuthentication },                 /* alias */
 #ifdef KRB4  #ifdef KRB4
         { "kerberosauthentication", sKerberosAuthentication },          { "kerberosauthentication", sKerberosAuthentication },
         { "kerberosorlocalpasswd", sKerberosOrLocalPasswd },          { "kerberosorlocalpasswd", sKerberosOrLocalPasswd },
Line 228 
Line 248 
 #endif  #endif
         { "passwordauthentication", sPasswordAuthentication },          { "passwordauthentication", sPasswordAuthentication },
         { "kbdinteractiveauthentication", sKbdInteractiveAuthentication },          { "kbdinteractiveauthentication", sKbdInteractiveAuthentication },
 #ifdef SKEY          { "challengeresponseauthentication", sChallengeResponseAuthentication },
         { "skeyauthentication", sSkeyAuthentication },          { "skeyauthentication", sChallengeResponseAuthentication }, /* alias */
 #endif  
         { "checkmail", sCheckMail },          { "checkmail", sCheckMail },
         { "listenaddress", sListenAddress },          { "listenaddress", sListenAddress },
         { "printmotd", sPrintMotd },          { "printmotd", sPrintMotd },
Line 242 
Line 261 
         { "strictmodes", sStrictModes },          { "strictmodes", sStrictModes },
         { "permitemptypasswords", sEmptyPasswd },          { "permitemptypasswords", sEmptyPasswd },
         { "uselogin", sUseLogin },          { "uselogin", sUseLogin },
         { "randomseed", sRandomSeedFile },  
         { "keepalive", sKeepAlives },          { "keepalive", sKeepAlives },
         { "allowtcpforwarding", sAllowTcpForwarding },          { "allowtcpforwarding", sAllowTcpForwarding },
         { "allowusers", sAllowUsers },          { "allowusers", sAllowUsers },
Line 250 
Line 268 
         { "allowgroups", sAllowGroups },          { "allowgroups", sAllowGroups },
         { "denygroups", sDenyGroups },          { "denygroups", sDenyGroups },
         { "ciphers", sCiphers },          { "ciphers", sCiphers },
           { "macs", sMacs },
         { "protocol", sProtocol },          { "protocol", sProtocol },
         { "gatewayports", sGatewayPorts },          { "gatewayports", sGatewayPorts },
         { "subsystem", sSubsystem },          { "subsystem", sSubsystem },
         { "maxstartups", sMaxStartups },          { "maxstartups", sMaxStartups },
           { "banner", sBanner },
           { "reversemappingcheck", sReverseMappingCheck },
         { NULL, 0 }          { NULL, 0 }
 };  };
   
Line 266 
Line 287 
 parse_token(const char *cp, const char *filename,  parse_token(const char *cp, const char *filename,
             int linenum)              int linenum)
 {  {
         unsigned int i;          u_int i;
   
         for (i = 0; keywords[i].name; i++)          for (i = 0; keywords[i].name; i++)
                 if (strcasecmp(cp, keywords[i].name) == 0)                  if (strcasecmp(cp, keywords[i].name) == 0)
Line 283 
Line 304 
 void  void
 add_listen_addr(ServerOptions *options, char *addr)  add_listen_addr(ServerOptions *options, char *addr)
 {  {
         extern int IPv4or6;  
         struct addrinfo hints, *ai, *aitop;          struct addrinfo hints, *ai, *aitop;
         char strport[NI_MAXSERV];          char strport[NI_MAXSERV];
         int gaierr;          int gaierr;
Line 298 
Line 318 
                 hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;                  hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
                 snprintf(strport, sizeof strport, "%d", options->ports[i]);                  snprintf(strport, sizeof strport, "%d", options->ports[i]);
                 if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)                  if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
                         fatal("bad addr or host: %s (%s)\n",                          fatal("bad addr or host: %s (%s)",
                             addr ? addr : "<NULL>",                              addr ? addr : "<NULL>",
                             gai_strerror(gaierr));                              gai_strerror(gaierr));
                 for (ai = aitop; ai->ai_next; ai = ai->ai_next)                  for (ai = aitop; ai->ai_next; ai = ai->ai_next)
Line 334 
Line 354 
                 /* Ignore leading whitespace */                  /* Ignore leading whitespace */
                 if (*arg == '\0')                  if (*arg == '\0')
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!*arg || *arg == '#')                  if (!arg || !*arg || *arg == '#')
                         continue;                          continue;
                   intptr = NULL;
                   charptr = NULL;
                 opcode = parse_token(arg, filename, linenum);                  opcode = parse_token(arg, filename, linenum);
                 switch (opcode) {                  switch (opcode) {
                 case sBadOption:                  case sBadOption:
Line 349 
Line 371 
                                 fatal("%s line %d: ports must be specified before "                                  fatal("%s line %d: ports must be specified before "
                                     "ListenAdress.\n", filename, linenum);                                      "ListenAdress.\n", filename, linenum);
                         if (options->num_ports >= MAX_PORTS)                          if (options->num_ports >= MAX_PORTS)
                                 fatal("%s line %d: too many ports.\n",                                  fatal("%s line %d: too many ports.",
                                     filename, linenum);                                      filename, linenum);
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                                 fatal("%s line %d: missing port number.\n",                                  fatal("%s line %d: missing port number.",
                                     filename, linenum);                                      filename, linenum);
                         options->ports[options->num_ports++] = atoi(arg);                          options->ports[options->num_ports++] = atoi(arg);
                         break;                          break;
Line 383 
Line 405 
                 case sListenAddress:                  case sListenAddress:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                                 fatal("%s line %d: missing inet addr.\n",                                  fatal("%s line %d: missing inet addr.",
                                     filename, linenum);                                      filename, linenum);
                         add_listen_addr(options, arg);                          add_listen_addr(options, arg);
                         break;                          break;
   
                 case sHostKeyFile:                  case sHostKeyFile:
                 case sHostDSAKeyFile:                          intptr = &options->num_host_key_files;
                         charptr = (opcode == sHostKeyFile ) ?                          if (*intptr >= MAX_HOSTKEYS) {
                             &options->host_key_file : &options->host_dsa_key_file;                                  fprintf(stderr,
                                       "%s line %d: too many host keys specified (max %d).\n",
                                       filename, linenum, MAX_HOSTKEYS);
                                   exit(1);
                           }
                           charptr = &options->host_key_files[*intptr];
 parse_filename:  parse_filename:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0') {
Line 399 
Line 426 
                                     filename, linenum);                                      filename, linenum);
                                 exit(1);                                  exit(1);
                         }                          }
                         if (*charptr == NULL)                          if (*charptr == NULL) {
                                 *charptr = tilde_expand_filename(arg, getuid());                                  *charptr = tilde_expand_filename(arg, getuid());
                                   /* increase optional counter */
                                   if (intptr != NULL)
                                           *intptr = *intptr + 1;
                           }
                         break;                          break;
   
                 case sPidFile:                  case sPidFile:
                         charptr = &options->pid_file;                          charptr = &options->pid_file;
                         goto parse_filename;                          goto parse_filename;
   
                 case sRandomSeedFile:  
                         fprintf(stderr, "%s line %d: \"randomseed\" option is obsolete.\n",  
                                 filename, linenum);  
                         arg = strdelim(&cp);  
                         break;  
   
                 case sPermitRootLogin:                  case sPermitRootLogin:
                         intptr = &options->permit_root_login;                          intptr = &options->permit_root_login;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0') {
                                 fprintf(stderr, "%s line %d: missing yes/without-password/no argument.\n",                                  fprintf(stderr, "%s line %d: missing yes/"
                                         filename, linenum);                                      "without-password/forced-commands-only/no "
                                       "argument.\n", filename, linenum);
                                 exit(1);                                  exit(1);
                         }                          }
                         if (strcmp(arg, "without-password") == 0)                          if (strcmp(arg, "without-password") == 0)
                                 value = 2;                                  value = PERMIT_NO_PASSWD;
                           else if (strcmp(arg, "forced-commands-only") == 0)
                                   value = PERMIT_FORCED_ONLY;
                         else if (strcmp(arg, "yes") == 0)                          else if (strcmp(arg, "yes") == 0)
                                 value = 1;                                  value = PERMIT_YES;
                         else if (strcmp(arg, "no") == 0)                          else if (strcmp(arg, "no") == 0)
                                 value = 0;                                  value = PERMIT_NO;
                         else {                          else {
                                 fprintf(stderr, "%s line %d: Bad yes/without-password/no argument: %s\n",                                  fprintf(stderr, "%s line %d: Bad yes/"
                                         filename, linenum, arg);                                      "without-password/forced-commands-only/no "
                                       "argument: %s\n", filename, linenum, arg);
                                 exit(1);                                  exit(1);
                         }                          }
                         if (*intptr == -1)                          if (*intptr == -1)
Line 474 
Line 503 
                         intptr = &options->rsa_authentication;                          intptr = &options->rsa_authentication;
                         goto parse_flag;                          goto parse_flag;
   
                 case sDSAAuthentication:                  case sPubkeyAuthentication:
                         intptr = &options->dsa_authentication;                          intptr = &options->pubkey_authentication;
                         goto parse_flag;                          goto parse_flag;
   
 #ifdef KRB4  #ifdef KRB4
Line 514 
Line 543 
                         intptr = &options->check_mail;                          intptr = &options->check_mail;
                         goto parse_flag;                          goto parse_flag;
   
 #ifdef SKEY                  case sChallengeResponseAuthentication:
                 case sSkeyAuthentication:                          intptr = &options->challenge_reponse_authentication;
                         intptr = &options->skey_authentication;  
                         goto parse_flag;                          goto parse_flag;
 #endif  
   
                 case sPrintMotd:                  case sPrintMotd:
                         intptr = &options->print_motd;                          intptr = &options->print_motd;
Line 535 
Line 562 
                 case sXAuthLocation:                  case sXAuthLocation:
                         charptr = &options->xauth_location;                          charptr = &options->xauth_location;
                         goto parse_filename;                          goto parse_filename;
   
                 case sStrictModes:                  case sStrictModes:
                         intptr = &options->strict_modes;                          intptr = &options->strict_modes;
                         goto parse_flag;                          goto parse_flag;
Line 556 
Line 583 
                         intptr = &options->gateway_ports;                          intptr = &options->gateway_ports;
                         goto parse_flag;                          goto parse_flag;
   
                   case sReverseMappingCheck:
                           intptr = &options->reverse_mapping_check;
                           goto parse_flag;
   
                 case sLogFacility:                  case sLogFacility:
                         intptr = (int *) &options->log_facility;                          intptr = (int *) &options->log_facility;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         value = log_facility_number(arg);                          value = log_facility_number(arg);
                         if (value == (SyslogFacility) - 1)                          if (value == (SyslogFacility) - 1)
                                 fatal("%.200s line %d: unsupported log facility '%s'\n",                                  fatal("%.200s line %d: unsupported log facility '%s'",
                                     filename, linenum, arg ? arg : "<NONE>");                                      filename, linenum, arg ? arg : "<NONE>");
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = (SyslogFacility) value;                                  *intptr = (SyslogFacility) value;
Line 572 
Line 603 
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         value = log_level_number(arg);                          value = log_level_number(arg);
                         if (value == (LogLevel) - 1)                          if (value == (LogLevel) - 1)
                                 fatal("%.200s line %d: unsupported log level '%s'\n",                                  fatal("%.200s line %d: unsupported log level '%s'",
                                     filename, linenum, arg ? arg : "<NONE>");                                      filename, linenum, arg ? arg : "<NONE>");
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = (LogLevel) value;                                  *intptr = (LogLevel) value;
Line 585 
Line 616 
                 case sAllowUsers:                  case sAllowUsers:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_allow_users >= MAX_ALLOW_USERS)                                  if (options->num_allow_users >= MAX_ALLOW_USERS)
                                         fatal("%s line %d: too many allow users.\n",                                          fatal("%s line %d: too many allow users.",
                                             filename, linenum);                                              filename, linenum);
                                 options->allow_users[options->num_allow_users++] = xstrdup(arg);                                  options->allow_users[options->num_allow_users++] = xstrdup(arg);
                         }                          }
Line 594 
Line 625 
                 case sDenyUsers:                  case sDenyUsers:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_deny_users >= MAX_DENY_USERS)                                  if (options->num_deny_users >= MAX_DENY_USERS)
                                         fatal( "%s line %d: too many deny users.\n",                                          fatal( "%s line %d: too many deny users.",
                                             filename, linenum);                                              filename, linenum);
                                 options->deny_users[options->num_deny_users++] = xstrdup(arg);                                  options->deny_users[options->num_deny_users++] = xstrdup(arg);
                         }                          }
Line 603 
Line 634 
                 case sAllowGroups:                  case sAllowGroups:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_allow_groups >= MAX_ALLOW_GROUPS)                                  if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
                                         fatal("%s line %d: too many allow groups.\n",                                          fatal("%s line %d: too many allow groups.",
                                             filename, linenum);                                              filename, linenum);
                                 options->allow_groups[options->num_allow_groups++] = xstrdup(arg);                                  options->allow_groups[options->num_allow_groups++] = xstrdup(arg);
                         }                          }
Line 612 
Line 643 
                 case sDenyGroups:                  case sDenyGroups:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_deny_groups >= MAX_DENY_GROUPS)                                  if (options->num_deny_groups >= MAX_DENY_GROUPS)
                                         fatal("%s line %d: too many deny groups.\n",                                          fatal("%s line %d: too many deny groups.",
                                             filename, linenum);                                              filename, linenum);
                                 options->deny_groups[options->num_deny_groups++] = xstrdup(arg);                                  options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
                         }                          }
Line 629 
Line 660 
                                 options->ciphers = xstrdup(arg);                                  options->ciphers = xstrdup(arg);
                         break;                          break;
   
                   case sMacs:
                           arg = strdelim(&cp);
                           if (!arg || *arg == '\0')
                                   fatal("%s line %d: Missing argument.", filename, linenum);
                           if (!mac_valid(arg))
                                   fatal("%s line %d: Bad SSH2 mac spec '%s'.",
                                       filename, linenum, arg ? arg : "<NONE>");
                           if (options->macs == NULL)
                                   options->macs = xstrdup(arg);
                           break;
   
                 case sProtocol:                  case sProtocol:
                         intptr = &options->protocol;                          intptr = &options->protocol;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
Line 684 
Line 726 
                         intptr = &options->max_startups;                          intptr = &options->max_startups;
                         goto parse_int;                          goto parse_int;
   
                   case sBanner:
                           charptr = &options->banner;
                           goto parse_filename;
   
                 default:                  default:
                         fprintf(stderr, "%s line %d: Missing handler for opcode %s (%d)\n",                          fprintf(stderr, "%s line %d: Missing handler for opcode %s (%d)\n",
                                 filename, linenum, arg, opcode);                                  filename, linenum, arg, opcode);
                         exit(1);                          exit(1);
                 }                  }
                 if ((arg = strdelim(&cp)) != NULL && *arg != '\0') {                  if ((arg = strdelim(&cp)) != NULL && *arg != '\0') {
                         fprintf(stderr,                          fprintf(stderr,
                                 "%s line %d: garbage at end of line; \"%.200s\".\n",                                  "%s line %d: garbage at end of line; \"%.200s\".\n",
                                 filename, linenum, arg);                                  filename, linenum, arg);
                         exit(1);                          exit(1);

Legend:
Removed from v.1.53  
changed lines
  Added in v.1.53.2.3