Skip to content

Commit e309b65

Browse files
committed
transpile: Do not leak main argument strings
1 parent f84b233 commit e309b65

File tree

1 file changed

+91
-26
lines changed

1 file changed

+91
-26
lines changed

c2rust-transpile/src/translator/main_function.rs

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
//! Rust.
55
66
use super::*;
7+
use c2rust_ast_builder::CaptureBy;
78
use failure::format_err;
89
use proc_macro2::{TokenStream, TokenTree};
910

@@ -53,40 +54,105 @@ impl<'c> Translation<'c> {
5354
if n >= 2 {
5455
// `argv` and `argc`
5556

57+
// let mut args_strings: Vec<Vec<u8>> = (::std::env::args())
58+
// .map(|arg| {
59+
// (::std::ffi::CString::new(arg))
60+
// .expect("Failed to convert argument into CString.")
61+
// .into_bytes_with_nul()
62+
// })
63+
// .collect();
5664
stmts.push(mk().local_stmt(Box::new(mk().local(
57-
mk().mutbl().ident_pat("args"),
65+
mk().mutbl().ident_pat("args_strings"),
66+
Some(mk().path_ty(vec![mk().path_segment_with_args(
67+
"Vec",
68+
mk().angle_bracketed_args(vec![mk().path_ty(vec![
69+
mk().path_segment_with_args(
70+
"Vec",
71+
mk().angle_bracketed_args(vec![mk().ident_ty("u8")]),
72+
),
73+
])]),
74+
)])),
75+
Some(mk().method_call_expr(
76+
mk().method_call_expr(
77+
mk().call_expr(args_fn, vec![]),
78+
"map",
79+
vec![mk().closure_expr(
80+
CaptureBy::Ref,
81+
Movability::Movable,
82+
vec![mk().ident_pat("arg")],
83+
ReturnType::Default,
84+
mk().method_call_expr(
85+
mk().method_call_expr(
86+
mk().call_expr(
87+
mk().abs_path_expr(vec![
88+
"std", "ffi", "CString", "new",
89+
]),
90+
vec![mk().path_expr(vec!["arg"])],
91+
),
92+
"expect",
93+
vec![
94+
mk().lit_expr(
95+
"Failed to convert argument into CString.",
96+
),
97+
],
98+
),
99+
"into_bytes_with_nul",
100+
vec![],
101+
),
102+
)],
103+
),
104+
"collect",
105+
vec![],
106+
)),
107+
))));
108+
109+
// let mut args_ptrs: Vec<*mut ::core::ffi::c_char> = args_strings
110+
// .iter_mut()
111+
// .map(|arg| arg.as_mut_ptr() as *mut ::core::ffi::c_char)
112+
// .collect();
113+
stmts.push(mk().local_stmt(Box::new(mk().local(
114+
mk().mutbl().ident_pat("args_ptrs"),
58115
Some(mk().path_ty(vec![mk().path_segment_with_args(
59116
"Vec",
60117
mk().angle_bracketed_args(vec![
61118
mk().mutbl().ptr_ty(mk().abs_path_ty(vec!["core", "ffi", "c_char"])),
62119
]),
63120
)])),
64-
Some(mk().call_expr(mk().path_expr(vec!["Vec", "new"]), vec![])),
65-
))));
66-
stmts.push(mk().semi_stmt(mk().for_expr(
67-
mk().ident_pat("arg"),
68-
mk().call_expr(args_fn, vec![]),
69-
mk().block(vec![mk().semi_stmt(mk().method_call_expr(
70-
mk().path_expr(vec!["args"]),
71-
"push",
72-
vec![mk().method_call_expr(
121+
Some(mk().method_call_expr(
122+
mk().method_call_expr(
73123
mk().method_call_expr(
74-
mk().call_expr(
75-
// TODO(kkysen) change `"std"` to `"alloc"` after `#![feature(alloc_c_string)]` is stabilized in `1.63.0`
76-
mk().abs_path_expr(vec!["std", "ffi", "CString", "new"]),
77-
vec![mk().path_expr(vec!["arg"])],
78-
),
79-
"expect",
80-
vec![mk().lit_expr("Failed to convert argument into CString.")],
124+
mk().ident_expr("args_strings"),
125+
"iter_mut",
126+
vec![],
81127
),
82-
"into_raw",
83-
vec![],
84-
)],
85-
))]),
86-
None::<Ident>,
87-
)));
128+
"map",
129+
vec![
130+
mk().closure_expr(
131+
CaptureBy::Ref,
132+
Movability::Movable,
133+
vec![mk().ident_pat("arg")],
134+
ReturnType::Default,
135+
mk().cast_expr(
136+
mk().method_call_expr(
137+
mk().ident_expr("arg"),
138+
"as_mut_ptr",
139+
vec![],
140+
),
141+
mk().mutbl().ptr_ty(
142+
mk().abs_path_ty(vec!["core", "ffi", "c_char"]),
143+
),
144+
),
145+
),
146+
],
147+
),
148+
"collect",
149+
vec![],
150+
)),
151+
))));
152+
153+
// args_ptrs.push(::core::ptr::null_mut());
88154
stmts.push(mk().semi_stmt(mk().method_call_expr(
89-
mk().path_expr(vec!["args"]),
155+
mk().path_expr(vec!["args_ptrs"]),
90156
"push",
91157
vec![
92158
mk().call_expr(mk().abs_path_expr(vec!["core", "ptr", "null_mut"]), vec![]),
@@ -105,8 +171,7 @@ impl<'c> Translation<'c> {
105171
"Cannot find type of 'argv' argument in main function",
106172
)),
107173
}?;
108-
109-
let args = mk().ident_expr("args");
174+
let args = mk().ident_expr("args_ptrs");
110175
let argc = mk().binary_expr(
111176
BinOp::Sub(Default::default()),
112177
mk().method_call_expr(args.clone(), "len", no_args.clone()),

0 commit comments

Comments
 (0)