@@ -20,34 +20,36 @@ use nix::fcntl::{OFlag, openat};
2020use nix:: sys:: stat:: { FileStat , Mode , fstatat} ;
2121use nix:: unistd:: { UnlinkatFlags , unlinkat} ;
2222
23+ use crate :: translate;
24+
2325// Custom error types for better error reporting
2426#[ derive( thiserror:: Error , Debug ) ]
2527pub enum SafeTraversalError {
26- #[ error( "path contains null byte" ) ]
28+ #[ error( "{}" , translate! ( "safe-traversal-error-path- contains- null" ) ) ]
2729 PathContainsNull ,
2830
29- #[ error( "failed to open '{ path}': { source}" ) ]
31+ #[ error( "{}" , translate! ( "safe-traversal-error-open- failed" , "path" => path, " source" => source ) ) ]
3032 OpenFailed {
3133 path : String ,
3234 #[ source]
3335 source : io:: Error ,
3436 } ,
3537
36- #[ error( "failed to stat '{ path}': { source}" ) ]
38+ #[ error( "{}" , translate! ( "safe-traversal-error-stat- failed" , "path" => path, " source" => source ) ) ]
3739 StatFailed {
3840 path : String ,
3941 #[ source]
4042 source : io:: Error ,
4143 } ,
4244
43- #[ error( "failed to read directory '{ path}': { source}" ) ]
45+ #[ error( "{}" , translate! ( "safe-traversal-error- read-dir-failed" , "path" => path, " source" => source ) ) ]
4446 ReadDirFailed {
4547 path : String ,
4648 #[ source]
4749 source : io:: Error ,
4850 } ,
4951
50- #[ error( "failed to unlink '{ path}': { source}" ) ]
52+ #[ error( "{}" , translate! ( "safe-traversal-error-unlink- failed" , "path" => path, " source" => source ) ) ]
5153 UnlinkFailed {
5254 path : String ,
5355 #[ source]
@@ -58,9 +60,10 @@ pub enum SafeTraversalError {
5860impl From < SafeTraversalError > for io:: Error {
5961 fn from ( err : SafeTraversalError ) -> Self {
6062 match err {
61- SafeTraversalError :: PathContainsNull => {
62- io:: Error :: new ( io:: ErrorKind :: InvalidInput , "path contains null byte" )
63- }
63+ SafeTraversalError :: PathContainsNull => io:: Error :: new (
64+ io:: ErrorKind :: InvalidInput ,
65+ translate ! ( "safe-traversal-error-path-contains-null" ) ,
66+ ) ,
6467 SafeTraversalError :: OpenFailed { source, .. } => source,
6568 SafeTraversalError :: StatFailed { source, .. } => source,
6669 SafeTraversalError :: ReadDirFailed { source, .. } => source,
@@ -165,7 +168,7 @@ impl DirFd {
165168 /// Get raw stat data for this directory
166169 pub fn fstat ( & self ) -> io:: Result < FileStat > {
167170 let stat = nix:: sys:: stat:: fstat ( & self . fd ) . map_err ( |e| SafeTraversalError :: StatFailed {
168- path : "< current directory>" . to_string ( ) ,
171+ path : translate ! ( "safe-traversal- current- directory" ) ,
169172 source : io:: Error :: from_raw_os_error ( e as i32 ) ,
170173 } ) ?;
171174
@@ -176,7 +179,7 @@ impl DirFd {
176179 pub fn read_dir ( & self ) -> io:: Result < Vec < OsString > > {
177180 read_dir_entries ( & self . fd ) . map_err ( |e| {
178181 SafeTraversalError :: ReadDirFailed {
179- path : "< directory>" . to_string ( ) ,
182+ path : translate ! ( "safe-traversal- directory" ) ,
180183 source : e,
181184 }
182185 . into ( )
@@ -209,7 +212,7 @@ impl DirFd {
209212 if fd < 0 {
210213 return Err ( io:: Error :: new (
211214 io:: ErrorKind :: InvalidInput ,
212- " invalid file descriptor" ,
215+ translate ! ( "safe-traversal-error- invalid-fd" ) ,
213216 ) ) ;
214217 }
215218 // SAFETY: We've verified fd >= 0, and the caller is transferring ownership
0 commit comments