]> andersk Git - gssapi-openssh.git/blobdiff - openssh/readconf.c
merged OpenSSH 3.9p1 to trunk
[gssapi-openssh.git] / openssh / readconf.c
index c5b0b8eef706f19c798474af6ad745967decc17f..dce06dcc6a99cd218265218af56598b27b08f5cc 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenBSD: readconf.c,v 1.165 2008/01/19 23:09:49 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: readconf.c,v 1.145 2005/12/08 18:34:11 reyk Exp $");
 
-#include "ssh.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
 #include "xmalloc.h"
+#include "ssh.h"
 #include "compat.h"
 #include "cipher.h"
 #include "pathnames.h"
 #include "log.h"
+#include "key.h"
 #include "readconf.h"
 #include "match.h"
 #include "misc.h"
+#include "buffer.h"
 #include "kex.h"
 #include "mac.h"
 
@@ -94,6 +111,7 @@ RCSID("$OpenBSD: readconf.c,v 1.145 2005/12/08 18:34:11 reyk Exp $");
 typedef enum {
        oBadOption,
        oForwardAgent, oForwardX11, oForwardX11Trusted, oGatewayPorts,
+       oExitOnForwardFailure,
        oPasswordAuthentication, oRSAAuthentication,
        oChallengeResponseAuthentication, oXAuthLocation,
        oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,
@@ -128,6 +146,7 @@ static struct {
        { "forwardagent", oForwardAgent },
        { "forwardx11", oForwardX11 },
        { "forwardx11trusted", oForwardX11Trusted },
+       { "exitonforwardfailure", oExitOnForwardFailure },
        { "xauthlocation", oXAuthLocation },
        { "gatewayports", oGatewayPorts },
        { "useprivilegedport", oUsePrivilegedPort },
@@ -320,7 +339,9 @@ process_config_line(Options *options, const char *host,
                    int *activep)
 {
        char *s, **charptr, *endofnumber, *keyword, *arg, *arg2, fwdarg[256];
-       int opcode, *intptr, value, value2;
+       int opcode, *intptr, value, value2, scale;
+       LogLevel *log_level_ptr;
+       long long orig, val64;
        size_t len;
        Forward fwd;
 
@@ -333,7 +354,8 @@ process_config_line(Options *options, const char *host,
 
        s = line;
        /* Get the keyword. (Each line is supposed to begin with a keyword). */
-       keyword = strdelim(&s);
+       if ((keyword = strdelim(&s)) == NULL)
+               return 0;
        /* Ignore leading whitespace. */
        if (*keyword == '\0')
                keyword = strdelim(&s);
@@ -357,7 +379,7 @@ parse_time:
                if ((value = convtime(arg)) == -1)
                        fatal("%s line %d: invalid time value.",
                            filename, linenum);
-               if (*intptr == -1)
+               if (*activep && *intptr == -1)
                        *intptr = value;
                break;
 
@@ -390,6 +412,10 @@ parse_flag:
                intptr = &options->gateway_ports;
                goto parse_flag;
 
+       case oExitOnForwardFailure:
+               intptr = &options->exit_on_forward_failure;
+               goto parse_flag;
+
        case oUsePrivilegedPort:
                intptr = &options->use_privileged_port;
                goto parse_flag;
@@ -453,10 +479,21 @@ parse_flag:
        case oNoneEnabled:
                intptr = &options->none_enabled;
                goto parse_flag;
-
+       /* we check to see if the command comes from the */
+       /* command line or not. If it does then enable it */
+       /* otherwise fail. NONE should never be a default configuration */
        case oNoneSwitch:
-               intptr = &options->none_switch;
-               goto parse_flag;
+               if(strcmp(filename,"command-line")==0)
+               {               
+                   intptr = &options->none_switch;
+                   goto parse_flag;
+               } else {
+                   error("NoneSwitch is found in %.200s.\nYou may only use this configuration option from the command line", filename);
+                   error("Continuing...");
+                   debug("NoneSwitch directive found in %.200s.", filename);
+                   return 0;
+               }
 
        case oHPNDisabled:
                intptr = &options->hpn_disabled;
@@ -474,7 +511,6 @@ parse_flag:
                intptr = &options->verify_host_key_dns;
                goto parse_yesnoask;
 
-
        case oStrictHostKeyChecking:
                intptr = &options->strict_host_key_checking;
 parse_yesnoask:
@@ -516,28 +552,41 @@ parse_yesnoask:
                goto parse_int;
 
        case oRekeyLimit:
-               intptr = &options->rekey_limit;
                arg = strdelim(&s);
                if (!arg || *arg == '\0')
                        fatal("%.200s line %d: Missing argument.", filename, linenum);
                if (arg[0] < '0' || arg[0] > '9')
                        fatal("%.200s line %d: Bad number.", filename, linenum);
-               value = strtol(arg, &endofnumber, 10);
+               orig = val64 = strtoll(arg, &endofnumber, 10);
                if (arg == endofnumber)
                        fatal("%.200s line %d: Bad number.", filename, linenum);
                switch (toupper(*endofnumber)) {
+               case '\0':
+                       scale = 1;
+                       break;
                case 'K':
-                       value *= 1<<10;
+                       scale = 1<<10;
                        break;
                case 'M':
-                       value *= 1<<20;
+                       scale = 1<<20;
                        break;
                case 'G':
-                       value *= 1<<30;
+                       scale = 1<<30;
                        break;
+               default:
+                       fatal("%.200s line %d: Invalid RekeyLimit suffix",
+                           filename, linenum);
                }
-               if (*activep && *intptr == -1)
-                       *intptr = value;
+               val64 *= scale;
+               /* detect integer wrap and too-large limits */
+               if ((val64 / scale) != orig || val64 > UINT_MAX)
+                       fatal("%.200s line %d: RekeyLimit too large",
+                           filename, linenum);
+               if (val64 < 16)
+                       fatal("%.200s line %d: RekeyLimit too small",
+                           filename, linenum);
+               if (*activep && options->rekey_limit == -1)
+                       options->rekey_limit = (u_int32_t)val64;
                break;
 
        case oIdentityFile:
@@ -549,7 +598,7 @@ parse_yesnoask:
                        if (*intptr >= SSH_MAX_IDENTITY_FILES)
                                fatal("%.200s line %d: Too many identity files specified (max %d).",
                                    filename, linenum, SSH_MAX_IDENTITY_FILES);
-                       charptr =  &options->identity_files[*intptr];
+                       charptr = &options->identity_files[*intptr];
                        *charptr = xstrdup(arg);
                        *intptr = *intptr + 1;
                }
@@ -700,14 +749,14 @@ parse_int:
                break;
 
        case oLogLevel:
-               intptr = (int *) &options->log_level;
+               log_level_ptr = &options->log_level;
                arg = strdelim(&s);
                value = log_level_number(arg);
                if (value == SYSLOG_LEVEL_NOT_SET)
                        fatal("%.200s line %d: unsupported log level '%s'",
                            filename, linenum, arg ? arg : "<NONE>");
-               if (*activep && (LogLevel) *intptr == SYSLOG_LEVEL_NOT_SET)
-                       *intptr = (LogLevel) value;
+               if (*activep && *log_level_ptr == SYSLOG_LEVEL_NOT_SET)
+                       *log_level_ptr = (LogLevel) value;
                break;
 
        case oLocalForward:
@@ -1010,6 +1059,7 @@ initialize_options(Options * options)
        options->forward_agent = -1;
        options->forward_x11 = -1;
        options->forward_x11_trusted = -1;
+       options->exit_on_forward_failure = -1;
        options->xauth_location = NULL;
        options->gateway_ports = -1;
        options->use_privileged_port = -1;
@@ -1098,6 +1148,8 @@ fill_default_options(Options * options)
                options->forward_x11 = 0;
        if (options->forward_x11_trusted == -1)
                options->forward_x11_trusted = 0;
+       if (options->exit_on_forward_failure == -1)
+               options->exit_on_forward_failure = 0;
        if (options->xauth_location == NULL)
                options->xauth_location = _PATH_XAUTH;
        if (options->gateway_ports == -1)
@@ -1208,20 +1260,25 @@ fill_default_options(Options * options)
                options->none_switch = 0;
        if (options->hpn_disabled == -1)
                options->hpn_disabled = 0;
-       if (options->hpn_buffer_size == -1)
-               options->hpn_buffer_size = 2*1024*1024;
-       else {
+       if (options->hpn_buffer_size > -1)
+       {
+         /* if a user tries to set the size to 0 set it to 1KB */
                if (options->hpn_buffer_size == 0)
-                       options->hpn_buffer_size = 1;
-               /*limit the buffer to 7MB*/
-               if (options->hpn_buffer_size > 7168)
-                       options->hpn_buffer_size = 7168;
-               options->hpn_buffer_size *=1024;
-       }       
+               options->hpn_buffer_size = 1024;
+               /*limit the buffer to 64MB*/
+               if (options->hpn_buffer_size > 65536)
+               {
+                       options->hpn_buffer_size = 65536*1024;
+                       debug("User requested buffer larger than 64MB. Request reverted to 64MB");
+               }
+               debug("hpn_buffer_size set to %d", options->hpn_buffer_size);
+       }
        if (options->tcp_rcv_buf == 0)
                options->tcp_rcv_buf = 1;
        if (options->tcp_rcv_buf > -1) 
                options->tcp_rcv_buf *=1024;
+       if (options->tcp_rcv_buf_poll == -1)
+               options->tcp_rcv_buf_poll = 1;
        if (options->control_master == -1)
                options->control_master = 0;
        if (options->hash_known_hosts == -1)
@@ -1259,7 +1316,7 @@ parse_forward(Forward *fwd, const char *fwdspec)
        cp = p = xstrdup(fwdspec);
 
        /* skip leading spaces */
-       while (*cp && isspace(*cp))
+       while (isspace(*cp))
                cp++;
 
        for (i = 0; i < 4; ++i)
@@ -1290,7 +1347,7 @@ parse_forward(Forward *fwd, const char *fwdspec)
 
        xfree(p);
 
-       if (fwd->listen_port == 0 && fwd->connect_port == 0)
+       if (fwd->listen_port == 0 || fwd->connect_port == 0)
                goto fail_free;
 
        if (fwd->connect_host != NULL &&
This page took 0.049086 seconds and 4 git commands to generate.