@@ -38,6 +38,8 @@ impl RelativePath {
38
38
#[ derive( Debug , thiserror:: Error ) ]
39
39
#[ allow( missing_docs) ]
40
40
pub enum Error {
41
+ #[ error( "A RelativePath is not allowed to be absolute" ) ]
42
+ IsAbsolute ,
41
43
#[ error( transparent) ]
42
44
ContainsInvalidComponent ( #[ from] gix_validate:: path:: component:: Error ) ,
43
45
#[ error( transparent) ]
@@ -51,6 +53,11 @@ impl<'a> TryFrom<&'a str> for &'a RelativePath {
51
53
use std:: path:: Path ;
52
54
53
55
let path: & std:: path:: Path = Path :: new ( value) ;
56
+
57
+ if path. is_absolute ( ) {
58
+ return Err ( Error :: IsAbsolute ) ;
59
+ }
60
+
54
61
let options: Options = Default :: default ( ) ;
55
62
56
63
for component in path. components ( ) {
@@ -68,6 +75,11 @@ impl<'a> TryFrom<&'a BStr> for &'a RelativePath {
68
75
69
76
fn try_from ( value : & ' a BStr ) -> Result < Self , Self :: Error > {
70
77
let path: & std:: path:: Path = & try_from_bstr ( value) ?;
78
+
79
+ if path. is_absolute ( ) {
80
+ return Err ( Error :: IsAbsolute ) ;
81
+ }
82
+
71
83
let options: Options = Default :: default ( ) ;
72
84
73
85
for component in path. components ( ) {
@@ -87,6 +99,10 @@ impl<'a, const N: usize> TryFrom<&'a [u8; N]> for &'a RelativePath {
87
99
fn try_from ( value : & ' a [ u8 ; N ] ) -> Result < Self , Self :: Error > {
88
100
let path: & std:: path:: Path = try_from_byte_slice ( value) ?;
89
101
102
+ if path. is_absolute ( ) {
103
+ return Err ( Error :: IsAbsolute ) ;
104
+ }
105
+
90
106
let options: Options = Default :: default ( ) ;
91
107
92
108
for component in path. components ( ) {
@@ -105,6 +121,10 @@ impl<'a> TryFrom<&'a BString> for &'a RelativePath {
105
121
fn try_from ( value : & ' a BString ) -> Result < Self , Self :: Error > {
106
122
let path: & std:: path:: Path = & try_from_bstr ( value. as_bstr ( ) ) ?;
107
123
124
+ if path. is_absolute ( ) {
125
+ return Err ( Error :: IsAbsolute ) ;
126
+ }
127
+
108
128
let options: Options = Default :: default ( ) ;
109
129
110
130
for component in path. components ( ) {
@@ -131,3 +151,33 @@ impl AsRef<[u8]> for RelativePath {
131
151
self . inner . as_bytes ( )
132
152
}
133
153
}
154
+
155
+ #[ cfg( test) ]
156
+ mod tests {
157
+ use super :: * ;
158
+
159
+ #[ test]
160
+ fn absolute_paths_return_err ( ) {
161
+ let path_str: & str = "/refs/heads" ;
162
+ let path_bstr: & BStr = path_str. into ( ) ;
163
+ let path_u8: & [ u8 ; 11 ] = b"/refs/heads" ;
164
+ let path_bstring: BString = "/refs/heads" . into ( ) ;
165
+
166
+ assert ! ( matches!(
167
+ TryInto :: <& RelativePath >:: try_into( path_str) ,
168
+ Err ( Error :: IsAbsolute )
169
+ ) ) ;
170
+ assert ! ( matches!(
171
+ TryInto :: <& RelativePath >:: try_into( path_bstr) ,
172
+ Err ( Error :: IsAbsolute )
173
+ ) ) ;
174
+ assert ! ( matches!(
175
+ TryInto :: <& RelativePath >:: try_into( path_u8) ,
176
+ Err ( Error :: IsAbsolute )
177
+ ) ) ;
178
+ assert ! ( matches!(
179
+ TryInto :: <& RelativePath >:: try_into( & path_bstring) ,
180
+ Err ( Error :: IsAbsolute )
181
+ ) ) ;
182
+ }
183
+ }
0 commit comments