diff options
Diffstat (limited to 'readconf.c')
-rw-r--r-- | readconf.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/readconf.c b/readconf.c index 2b8ff58d6..aca5b8eff 100644 --- a/readconf.c +++ b/readconf.c | |||
@@ -12,7 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include "includes.h" | 14 | #include "includes.h" |
15 | RCSID("$OpenBSD: readconf.c,v 1.128 2004/03/05 10:53:58 markus Exp $"); | 15 | RCSID("$OpenBSD: readconf.c,v 1.134 2004/07/11 17:48:47 deraadt Exp $"); |
16 | 16 | ||
17 | #include "ssh.h" | 17 | #include "ssh.h" |
18 | #include "xmalloc.h" | 18 | #include "xmalloc.h" |
@@ -106,6 +106,7 @@ typedef enum { | |||
106 | oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout, | 106 | oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout, |
107 | oAddressFamily, oGssAuthentication, oGssDelegateCreds, | 107 | oAddressFamily, oGssAuthentication, oGssDelegateCreds, |
108 | oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly, | 108 | oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly, |
109 | oSendEnv, oControlPath, oControlMaster, | ||
109 | oProtocolKeepAlives, oSetupTimeOut, | 110 | oProtocolKeepAlives, oSetupTimeOut, |
110 | oDeprecated, oUnsupported | 111 | oDeprecated, oUnsupported |
111 | } OpCodes; | 112 | } OpCodes; |
@@ -194,6 +195,9 @@ static struct { | |||
194 | { "addressfamily", oAddressFamily }, | 195 | { "addressfamily", oAddressFamily }, |
195 | { "serveraliveinterval", oServerAliveInterval }, | 196 | { "serveraliveinterval", oServerAliveInterval }, |
196 | { "serveralivecountmax", oServerAliveCountMax }, | 197 | { "serveralivecountmax", oServerAliveCountMax }, |
198 | { "sendenv", oSendEnv }, | ||
199 | { "controlpath", oControlPath }, | ||
200 | { "controlmaster", oControlMaster }, | ||
197 | { "protocolkeepalives", oProtocolKeepAlives }, | 201 | { "protocolkeepalives", oProtocolKeepAlives }, |
198 | { "setuptimeout", oSetupTimeOut }, | 202 | { "setuptimeout", oSetupTimeOut }, |
199 | { NULL, oBadOption } | 203 | { NULL, oBadOption } |
@@ -753,6 +757,27 @@ parse_int: | |||
753 | intptr = &options->server_alive_count_max; | 757 | intptr = &options->server_alive_count_max; |
754 | goto parse_int; | 758 | goto parse_int; |
755 | 759 | ||
760 | case oSendEnv: | ||
761 | while ((arg = strdelim(&s)) != NULL && *arg != '\0') { | ||
762 | if (strchr(arg, '=') != NULL) | ||
763 | fatal("%s line %d: Invalid environment name.", | ||
764 | filename, linenum); | ||
765 | if (options->num_send_env >= MAX_SEND_ENV) | ||
766 | fatal("%s line %d: too many send env.", | ||
767 | filename, linenum); | ||
768 | options->send_env[options->num_send_env++] = | ||
769 | xstrdup(arg); | ||
770 | } | ||
771 | break; | ||
772 | |||
773 | case oControlPath: | ||
774 | charptr = &options->control_path; | ||
775 | goto parse_string; | ||
776 | |||
777 | case oControlMaster: | ||
778 | intptr = &options->control_master; | ||
779 | goto parse_yesnoask; | ||
780 | |||
756 | case oSetupTimeOut: | 781 | case oSetupTimeOut: |
757 | intptr = &options->setuptimeout; | 782 | intptr = &options->setuptimeout; |
758 | goto parse_int; | 783 | goto parse_int; |
@@ -787,7 +812,8 @@ parse_int: | |||
787 | */ | 812 | */ |
788 | 813 | ||
789 | int | 814 | int |
790 | read_config_file(const char *filename, const char *host, Options *options) | 815 | read_config_file(const char *filename, const char *host, Options *options, |
816 | int checkperm) | ||
791 | { | 817 | { |
792 | FILE *f; | 818 | FILE *f; |
793 | char line[1024]; | 819 | char line[1024]; |
@@ -795,10 +821,19 @@ read_config_file(const char *filename, const char *host, Options *options) | |||
795 | int bad_options = 0; | 821 | int bad_options = 0; |
796 | 822 | ||
797 | /* Open the file. */ | 823 | /* Open the file. */ |
798 | f = fopen(filename, "r"); | 824 | if ((f = fopen(filename, "r")) == NULL) |
799 | if (!f) | ||
800 | return 0; | 825 | return 0; |
801 | 826 | ||
827 | if (checkperm) { | ||
828 | struct stat sb; | ||
829 | |||
830 | if (fstat(fileno(f), &sb) == -1) | ||
831 | fatal("fstat %s: %s", filename, strerror(errno)); | ||
832 | if (((sb.st_uid != 0 && sb.st_uid != getuid()) || | ||
833 | (sb.st_mode & 022) != 0)) | ||
834 | fatal("Bad owner or permissions on %s", filename); | ||
835 | } | ||
836 | |||
802 | debug("Reading configuration data %.200s", filename); | 837 | debug("Reading configuration data %.200s", filename); |
803 | 838 | ||
804 | /* | 839 | /* |
@@ -888,6 +923,9 @@ initialize_options(Options * options) | |||
888 | options->verify_host_key_dns = -1; | 923 | options->verify_host_key_dns = -1; |
889 | options->server_alive_interval = -1; | 924 | options->server_alive_interval = -1; |
890 | options->server_alive_count_max = -1; | 925 | options->server_alive_count_max = -1; |
926 | options->num_send_env = 0; | ||
927 | options->control_path = NULL; | ||
928 | options->control_master = -1; | ||
891 | } | 929 | } |
892 | 930 | ||
893 | /* | 931 | /* |
@@ -1013,6 +1051,8 @@ fill_default_options(Options * options) | |||
1013 | } | 1051 | } |
1014 | if (options->server_alive_count_max == -1) | 1052 | if (options->server_alive_count_max == -1) |
1015 | options->server_alive_count_max = 3; | 1053 | options->server_alive_count_max = 3; |
1054 | if (options->control_master == -1) | ||
1055 | options->control_master = 0; | ||
1016 | if (options->setuptimeout == -1) { | 1056 | if (options->setuptimeout == -1) { |
1017 | /* in batch mode, default is 5mins */ | 1057 | /* in batch mode, default is 5mins */ |
1018 | if (options->batch_mode == 1) | 1058 | if (options->batch_mode == 1) |