(socket_path: &Path, expected_uid: u32)
| 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) { |
| 346 | Ok(metadata) => metadata, |
| 347 | Err(err) if err.kind() == io::ErrorKind::NotFound => return Ok(()), |
| 348 | Err(err) => return Err(format!("stat socket {}: {err}", socket_path.display())), |
| 349 | }; |
| 350 | let file_type = metadata.file_type(); |
| 351 | if file_type.is_symlink() { |
| 352 | return Err(format!( |
| 353 | "socket {} is a symlink; refusing to remove it", |
| 354 | socket_path.display() |
| 355 | )); |
| 356 | } |
| 357 | if metadata.uid() != expected_uid { |
| 358 | return Err(format!( |
| 359 | "socket {} is owned by uid {} but current euid is {}", |
| 360 | socket_path.display(), |
| 361 | metadata.uid(), |
| 362 | expected_uid |
| 363 | )); |
| 364 | } |
| 365 | if !file_type.is_socket() { |
| 366 | return Err(format!( |
| 367 | "socket path {} exists but is not a Unix socket", |
| 368 | socket_path.display() |
| 369 | )); |
| 370 | } |
| 371 | std::fs::remove_file(socket_path) |
| 372 | .map_err(|err| format!("remove stale socket {}: {err}", socket_path.display())) |
| 373 | } |
| 374 | |
| 375 | fn restrict_socket_permissions(socket_path: &Path) -> std::result::Result<(), String> { |
| 376 | std::fs::set_permissions(socket_path, std::fs::Permissions::from_mode(0o600)) |
no outgoing calls
no test coverage detected