11#[ macro_use]
22extern crate log;
33
4+ use base64:: prelude:: * ;
45use crossbeam_channel:: unbounded;
56#[ cfg( feature = "blk" ) ]
67use devices:: virtio:: block:: ImageType ;
@@ -1191,6 +1192,24 @@ unsafe fn collapse_str_array(array: &[*const c_char]) -> Result<String, std::str
11911192 Ok ( strvec. join ( " " ) )
11921193}
11931194
1195+ // unlike collapse_str_array, this doesn't do the UTF-8 conversion
1196+ // and just keeps the null-terminated strings as raw bytes
1197+ unsafe fn flatten_cstr_array ( array : & [ * const c_char ] ) -> Vec < u8 > {
1198+ let mut bytevec = Vec :: new ( ) ;
1199+
1200+ for item in array. iter ( ) . take ( MAX_ARGS ) {
1201+ if item. is_null ( ) {
1202+ break ;
1203+ } else {
1204+ let cs = CStr :: from_ptr ( * item) ;
1205+ bytevec. extend_from_slice ( cs. to_bytes ( ) ) ;
1206+ bytevec. push ( 0 ) ;
1207+ }
1208+ }
1209+
1210+ bytevec
1211+ }
1212+
11941213#[ allow( clippy:: format_collect) ]
11951214#[ allow( clippy:: missing_safety_doc) ]
11961215#[ no_mangle]
@@ -1221,7 +1240,14 @@ pub unsafe extern "C" fn krun_set_exec(
12211240 "" . to_string ( )
12221241 } ;
12231242
1224- let env = if !c_envp. is_null ( ) {
1243+ let args_raw = if !c_argv. is_null ( ) {
1244+ let argv_array: & [ * const c_char ] = slice:: from_raw_parts ( c_argv, MAX_ARGS ) ;
1245+ flatten_cstr_array ( argv_array)
1246+ } else {
1247+ vec ! [ ]
1248+ } ;
1249+
1250+ let mut env = if !c_envp. is_null ( ) {
12251251 let envp_array: & [ * const c_char ] = slice:: from_raw_parts ( c_envp, MAX_ARGS ) ;
12261252 match collapse_str_array ( envp_array) {
12271253 Ok ( s) => s,
@@ -1236,6 +1262,11 @@ pub unsafe extern "C" fn krun_set_exec(
12361262 . collect ( )
12371263 } ;
12381264
1265+ // KRUN_INIT_ARGVXX="<base64>" must have at most 128 bytes (KENV_MVALLEN on FreeBSD)
1266+ for ( i, args_part) in args_raw. chunks ( 78 ) . enumerate ( ) {
1267+ env += & format ! ( " KRUN_INIT_ARGV{}={}" , i, BASE64_STANDARD . encode( args_part) ) ;
1268+ }
1269+
12391270 match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
12401271 Entry :: Occupied ( mut ctx_cfg) => {
12411272 let cfg = ctx_cfg. get_mut ( ) ;
0 commit comments