(
socket_dir: &Path,
expected_uid: u32,
)
| 309 | } |
| 310 | |
| 311 | fn prepare_private_socket_dir( |
| 312 | socket_dir: &Path, |
| 313 | expected_uid: u32, |
| 314 | ) -> std::result::Result<(), String> { |
| 315 | std::fs::create_dir_all(socket_dir) |
| 316 | .map_err(|err| format!("create socket dir {}: {err}", socket_dir.display()))?; |
| 317 | let metadata = std::fs::symlink_metadata(socket_dir) |
| 318 | .map_err(|err| format!("stat socket dir {}: {err}", socket_dir.display()))?; |
| 319 | let file_type = metadata.file_type(); |
| 320 | if file_type.is_symlink() { |
| 321 | return Err(format!( |
| 322 | "socket dir {} is a symlink; refusing to use it", |
| 323 | socket_dir.display() |
| 324 | )); |
| 325 | } |
| 326 | if !file_type.is_dir() { |
| 327 | return Err(format!( |
| 328 | "socket dir {} is not a directory", |
| 329 | socket_dir.display() |
| 330 | )); |
| 331 | } |
| 332 | if metadata.uid() != expected_uid { |
| 333 | return Err(format!( |
| 334 | "socket dir {} is owned by uid {} but current euid is {}", |
| 335 | socket_dir.display(), |
| 336 | metadata.uid(), |
| 337 | expected_uid |
| 338 | )); |
| 339 | } |
| 340 | std::fs::set_permissions(socket_dir, std::fs::Permissions::from_mode(0o700)) |
| 341 | .map_err(|err| format!("chmod socket dir {}: {err}", socket_dir.display())) |
| 342 | } |
| 343 | |
| 344 | fn remove_stale_socket(socket_path: &Path, expected_uid: u32) -> std::result::Result<(), String> { |
| 345 | let metadata = match std::fs::symlink_metadata(socket_path) { |
no outgoing calls
no test coverage detected