@@ -27,34 +27,36 @@ use nix::fcntl::{OFlag, openat};
2727use nix:: sys:: stat:: { FileStat , Mode , fstatat} ;
2828use nix:: unistd:: { UnlinkatFlags , unlinkat} ;
2929
30+ use crate :: translate;
31+
3032// Custom error types for better error reporting
3133#[ derive( thiserror:: Error , Debug ) ]
3234pub enum SafeTraversalError {
33- #[ error( "path contains null byte" ) ]
35+ #[ error( "{}" , translate! ( "safe-traversal-error-path- contains- null" ) ) ]
3436 PathContainsNull ,
3537
36- #[ error( "failed to open '{ path}': { source}" ) ]
38+ #[ error( "{}" , translate! ( "safe-traversal-error-open- failed" , "path" => path, " source" => source ) ) ]
3739 OpenFailed {
3840 path : String ,
3941 #[ source]
4042 source : io:: Error ,
4143 } ,
4244
43- #[ error( "failed to stat '{ path}': { source}" ) ]
45+ #[ error( "{}" , translate! ( "safe-traversal-error-stat- failed" , "path" => path, " source" => source ) ) ]
4446 StatFailed {
4547 path : String ,
4648 #[ source]
4749 source : io:: Error ,
4850 } ,
4951
50- #[ error( "failed to read directory '{ path}': { source}" ) ]
52+ #[ error( "{}" , translate! ( "safe-traversal-error- read-dir-failed" , "path" => path, " source" => source ) ) ]
5153 ReadDirFailed {
5254 path : String ,
5355 #[ source]
5456 source : io:: Error ,
5557 } ,
5658
57- #[ error( "failed to unlink '{ path}': { source}" ) ]
59+ #[ error( "{}" , translate! ( "safe-traversal-error-unlink- failed" , "path" => path, " source" => source ) ) ]
5860 UnlinkFailed {
5961 path : String ,
6062 #[ source]
@@ -65,9 +67,10 @@ pub enum SafeTraversalError {
6567impl From < SafeTraversalError > for io:: Error {
6668 fn from ( err : SafeTraversalError ) -> Self {
6769 match err {
68- SafeTraversalError :: PathContainsNull => {
69- io:: Error :: new ( io:: ErrorKind :: InvalidInput , "path contains null byte" )
70- }
70+ SafeTraversalError :: PathContainsNull => io:: Error :: new (
71+ io:: ErrorKind :: InvalidInput ,
72+ translate ! ( "safe-traversal-error-path-contains-null" ) ,
73+ ) ,
7174 SafeTraversalError :: OpenFailed { source, .. } => source,
7275 SafeTraversalError :: StatFailed { source, .. } => source,
7376 SafeTraversalError :: ReadDirFailed { source, .. } => source,
@@ -168,7 +171,7 @@ impl DirFd {
168171 /// Get raw stat data for this directory
169172 pub fn fstat ( & self ) -> io:: Result < FileStat > {
170173 let stat = nix:: sys:: stat:: fstat ( & self . fd ) . map_err ( |e| SafeTraversalError :: StatFailed {
171- path : "< current directory>" . to_string ( ) ,
174+ path : translate ! ( "safe-traversal- current- directory" ) ,
172175 source : io:: Error :: from_raw_os_error ( e as i32 ) ,
173176 } ) ?;
174177
@@ -179,7 +182,7 @@ impl DirFd {
179182 pub fn read_dir ( & self ) -> io:: Result < Vec < OsString > > {
180183 read_dir_entries ( & self . fd ) . map_err ( |e| {
181184 SafeTraversalError :: ReadDirFailed {
182- path : "< directory>" . to_string ( ) ,
185+ path : translate ! ( "safe-traversal- directory" ) ,
183186 source : e,
184187 }
185188 . into ( )
@@ -211,7 +214,7 @@ impl DirFd {
211214 if fd < 0 {
212215 return Err ( io:: Error :: new (
213216 io:: ErrorKind :: InvalidInput ,
214- " invalid file descriptor" ,
217+ translate ! ( "safe-traversal-error- invalid-fd" ) ,
215218 ) ) ;
216219 }
217220 // SAFETY: We've verified fd >= 0, and the caller is transferring ownership
0 commit comments