@@ -72,33 +72,34 @@ fn test_id_u32() {
7272#[ cfg( feature = "std" ) ]
7373#[ test]
7474fn test_as_filename_osstring ( ) {
75- as_filename_test :: < std:: ffi:: OsString > ( lib_path ( ) . into_os_string ( ) ) ;
75+ as_filename_test :: < std:: ffi:: OsString > ( lib_path ( ) . into_os_string ( ) , "potato \0 beetroot" . into ( ) ) ;
7676}
7777
7878#[ cfg( feature = "std" ) ]
7979#[ test]
8080fn test_as_filename_osstr ( ) {
81- as_filename_test :: < & std:: ffi:: OsStr > ( lib_path ( ) . as_os_str ( ) ) ;
81+ let with_nulls = std:: ffi:: OsStr :: new ( "hazelnut\0 peanut" ) ;
82+ as_filename_test :: < & std:: ffi:: OsStr > ( lib_path ( ) . as_os_str ( ) , with_nulls) ;
8283}
8384
8485#[ cfg( feature = "std" ) ]
8586#[ test]
8687fn test_as_filename_pathbuf ( ) {
87- as_filename_test :: < std:: path:: PathBuf > ( lib_path ( ) ) ;
88+ as_filename_test :: < std:: path:: PathBuf > ( lib_path ( ) , "orange \0 grape" . into ( ) ) ;
8889}
8990
9091#[ cfg( feature = "std" ) ]
9192#[ test]
9293fn test_as_filename_path ( ) {
93- as_filename_test :: < & std:: path:: Path > ( & * lib_path ( ) ) ;
94+ as_filename_test :: < & std:: path:: Path > ( & * lib_path ( ) , std :: path :: Path :: new ( "peach \0 mango" ) ) ;
9495}
9596
9697#[ cfg( feature = "std" ) ]
9798#[ test]
9899fn test_as_filename_str ( ) {
99100 let path = lib_path ( ) ;
100101 if let Some ( p) = path. to_str ( ) {
101- as_filename_test :: < & str > ( p) ;
102+ as_filename_test :: < & str > ( p, "kiwi \0 peach \0 " ) ;
102103 }
103104}
104105
@@ -107,14 +108,18 @@ fn test_as_filename_str() {
107108fn test_as_filename_string ( ) {
108109 let path = lib_path ( ) ;
109110 if let Some ( p) = path. to_str ( ) {
110- as_filename_test :: < String > ( p. to_string ( ) ) ;
111+ as_filename_test :: < String > ( p. to_string ( ) , "apple \0 banana" . to_string ( ) ) ;
111112 }
112113}
113114
114115#[ cfg( feature = "std" ) ]
115- fn as_filename_test < T : libloading:: AsFilename > ( path : T ) {
116+ fn as_filename_test < T : libloading:: AsFilename > ( path : T , with_interior_nulls : T ) {
116117 make_helpers ( ) ;
117118 unsafe {
119+ assert ! ( matches!(
120+ Library :: new( with_interior_nulls) . unwrap_err( ) ,
121+ libloading:: Error :: InteriorZeroElements ,
122+ ) ) ;
118123 let lib = Library :: new ( path) . unwrap ( ) ;
119124 let f: Symbol < unsafe extern "C" fn ( u32 ) -> u32 > = lib. get ( b"test_identity_u32\0 " ) . unwrap ( ) ;
120125 assert_eq ! ( 42 , f( 42 ) ) ;
@@ -126,13 +131,15 @@ fn as_filename_test<T: libloading::AsFilename>(path: T) {
126131fn test_as_symbol_name_string ( ) {
127132 as_symbol_name_test :: < String > ( "test_identity_u32" . to_string ( ) ) ;
128133 as_symbol_name_test :: < String > ( "test_identity_u32\0 " . to_string ( ) ) ;
134+ as_symbol_name_test_interior_nulls :: < String > ( "test_iden\0 tity_u32" . to_string ( ) ) ;
129135}
130136
131137#[ cfg( feature = "std" ) ]
132138#[ test]
133139fn test_as_symbol_name_str ( ) {
134140 as_symbol_name_test :: < & str > ( "test_identity_u32" ) ;
135141 as_symbol_name_test :: < & str > ( "test_identity_u32\0 " ) ;
142+ as_symbol_name_test_interior_nulls :: < & str > ( "test_iden\0 tity_u32\0 " ) ;
136143}
137144
138145#[ cfg( feature = "std" ) ]
@@ -153,6 +160,9 @@ fn test_as_symbol_name_bytes() {
153160 as_symbol_name_test :: < & [ u8 ] > ( b"test_identity_u32" ) ;
154161 as_symbol_name_test :: < & [ u8 ] > ( b"test_identity_u32\0 " ) ;
155162 as_symbol_name_test :: < & [ u8 ; 18 ] > ( b"test_identity_u32\0 " ) ;
163+ as_symbol_name_test_interior_nulls :: < & [ u8 ] > ( b"test_identity\0 _u32" ) ;
164+ as_symbol_name_test_interior_nulls :: < & [ u8 ] > ( b"test\0 _identity_u32" ) ;
165+ as_symbol_name_test_interior_nulls :: < & [ u8 ; 19 ] > ( b"test_iden\0 tity_u32\0 " ) ;
156166}
157167
158168#[ cfg( feature = "std" ) ]
@@ -165,6 +175,18 @@ fn as_symbol_name_test<T: libloading::AsSymbolName>(symbol: T) {
165175 }
166176}
167177
178+ #[ cfg( feature = "std" ) ]
179+ fn as_symbol_name_test_interior_nulls < T : libloading:: AsSymbolName > ( symbol : T ) {
180+ make_helpers ( ) ;
181+ unsafe {
182+ let lib = Library :: new ( lib_path ( ) ) . unwrap ( ) ;
183+ assert ! ( matches!(
184+ lib. get:: <unsafe extern "C" fn ( u32 ) -> u32 >( symbol) ,
185+ Err ( libloading:: Error :: InteriorZeroElements ) ,
186+ ) ) ;
187+ }
188+ }
189+
168190#[ test]
169191#[ cfg( feature = "std" ) ]
170192fn test_try_into_ptr ( ) {
0 commit comments