@@ -45,6 +45,23 @@ fn sanitize_sh(path: &Path) -> String {
45
45
}
46
46
}
47
47
48
+ fn is_dir_writable_for_user ( dir : & PathBuf ) -> bool {
49
+ let tmp_file = dir. join ( ".tmp" ) ;
50
+ match fs:: File :: create ( & tmp_file) {
51
+ Ok ( _) => {
52
+ fs:: remove_file ( tmp_file) . unwrap ( ) ;
53
+ true
54
+ }
55
+ Err ( e) => {
56
+ if e. kind ( ) == std:: io:: ErrorKind :: PermissionDenied {
57
+ false
58
+ } else {
59
+ panic ! ( "Failed the write access check for the current user. {}" , e) ;
60
+ }
61
+ }
62
+ }
63
+ }
64
+
48
65
fn install_sh (
49
66
builder : & Builder < ' _ > ,
50
67
package : & str ,
@@ -56,6 +73,17 @@ fn install_sh(
56
73
57
74
let prefix = default_path ( & builder. config . prefix , "/usr/local" ) ;
58
75
let sysconfdir = prefix. join ( default_path ( & builder. config . sysconfdir , "/etc" ) ) ;
76
+
77
+ // Sanity check for the user write access on prefix and sysconfdir
78
+ assert ! (
79
+ is_dir_writable_for_user( & prefix) ,
80
+ "User doesn't have write access on `install.prefix` path in the `config.toml`." ,
81
+ ) ;
82
+ assert ! (
83
+ is_dir_writable_for_user( & sysconfdir) ,
84
+ "User doesn't have write access on `install.sysconfdir` path in `config.toml`."
85
+ ) ;
86
+
59
87
let datadir = prefix. join ( default_path ( & builder. config . datadir , "share" ) ) ;
60
88
let docdir = prefix. join ( default_path ( & builder. config . docdir , "share/doc/rust" ) ) ;
61
89
let mandir = prefix. join ( default_path ( & builder. config . mandir , "share/man" ) ) ;
@@ -92,6 +120,9 @@ fn prepare_dir(mut path: PathBuf) -> String {
92
120
// More information on the environment variable is available here:
93
121
// https://www.gnu.org/prep/standards/html_node/DESTDIR.html
94
122
if let Some ( destdir) = env:: var_os ( "DESTDIR" ) . map ( PathBuf :: from) {
123
+ // Sanity check for the user write access on DESTDIR
124
+ assert ! ( is_dir_writable_for_user( & destdir) , "User doesn't have write access on DESTDIR." ) ;
125
+
95
126
let without_destdir = path. clone ( ) ;
96
127
path = destdir;
97
128
// Custom .join() which ignores disk roots.
0 commit comments