aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ssh/src
diff options
context:
space:
mode:
authorHans Nilsson <[email protected]>2015-06-05 14:48:47 +0200
committerHans Nilsson <[email protected]>2015-06-05 14:48:47 +0200
commitcbda735e138a764e78cf668bcf9eec292bc5cc11 (patch)
tree7a2d38aba9952b6a0e196596ff9dfccea8612ec5 /lib/ssh/src
parent3f58cd3cf433343b9eb33cc433a26e43995e75d7 (diff)
parent834b38ff07d835d68f5ab62f78b40aa9c6341b6b (diff)
downloadotp-cbda735e138a764e78cf668bcf9eec292bc5cc11.tar.gz
otp-cbda735e138a764e78cf668bcf9eec292bc5cc11.tar.bz2
otp-cbda735e138a764e78cf668bcf9eec292bc5cc11.zip
Merge branch 'hans/ssh/check_dirs/OTP-12788'
* hans/ssh/check_dirs/OTP-12788: ssh: Check that user_dir and system_dir exists and are readable
Diffstat (limited to 'lib/ssh/src')
-rw-r--r--lib/ssh/src/ssh.erl34
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index 4a07473f74..18951c8c89 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -24,6 +24,7 @@
-include("ssh.hrl").
-include("ssh_connect.hrl").
-include_lib("public_key/include/public_key.hrl").
+-include_lib("kernel/include/file.hrl").
-export([start/0, start/1, stop/0, connect/3, connect/4, close/1, connection_info/2,
channel_info/3,
@@ -389,9 +390,9 @@ handle_option([Opt | Rest], SocketOptions, SshOptions) ->
handle_ssh_option({minimal_remote_max_packet_size, Value} = Opt) when is_integer(Value), Value >=0 ->
Opt;
handle_ssh_option({system_dir, Value} = Opt) when is_list(Value) ->
- Opt;
+ check_dir(Opt);
handle_ssh_option({user_dir, Value} = Opt) when is_list(Value) ->
- Opt;
+ check_dir(Opt);
handle_ssh_option({user_dir_fun, Value} = Opt) when is_function(Value) ->
Opt;
handle_ssh_option({silently_accept_hosts, Value} = Opt) when is_boolean(Value) ->
@@ -581,4 +582,31 @@ handle_ip(Inet) -> %% Default to ipv4
[inet | Inet]
end
end.
-
+
+check_dir({_,Dir} = Opt) ->
+ case directory_exist_readable(Dir) of
+ ok ->
+ Opt;
+ {error,Error} ->
+ throw({error, {eoptions,{Opt,Error}}})
+ end.
+
+directory_exist_readable(Dir) ->
+ case file:read_file_info(Dir) of
+ {ok, #file_info{type = directory,
+ access = Access}} ->
+ case Access of
+ read -> ok;
+ read_write -> ok;
+ _ -> {error, eacces}
+ end;
+
+ {ok, #file_info{}}->
+ {error, enotdir};
+
+ {error, Error} ->
+ {error, Error}
+ end.
+
+
+