Fix ICE caused by at-expanding argument 0 instead of removing it early
This commit is contained in:
parent
f1b1ed7e18
commit
6240d45189
4 changed files with 24 additions and 5 deletions
|
@ -18,6 +18,9 @@ fn arg_expand(arg: String) -> Result<Vec<String>, Error> {
|
|||
}
|
||||
}
|
||||
|
||||
/// **Note:** This function doesn't interpret argument 0 in any special way.
|
||||
/// If this function is intended to be used with command line arguments,
|
||||
/// `argv[0]` must be removed prior to calling it manually.
|
||||
pub fn arg_expand_all(at_args: &[String]) -> Vec<String> {
|
||||
let mut args = Vec::new();
|
||||
for arg in at_args {
|
||||
|
|
|
@ -237,6 +237,16 @@ fn run_compiler(
|
|||
Box<dyn FnOnce(&config::Options) -> Box<dyn CodegenBackend> + Send>,
|
||||
>,
|
||||
) -> interface::Result<()> {
|
||||
// Throw away the first argument, the name of the binary.
|
||||
// In case of at_args being empty, as might be the case by
|
||||
// passing empty argument array to execve under some platforms,
|
||||
// just use an empty slice.
|
||||
//
|
||||
// This situation was possible before due to arg_expand_all being
|
||||
// called before removing the argument, enabling a crash by calling
|
||||
// the compiler with @empty_file as argv[0] and no more arguments.
|
||||
let at_args = at_args.get(1..).unwrap_or_default();
|
||||
|
||||
let args = args::arg_expand_all(at_args);
|
||||
|
||||
let Some(matches) = handle_options(&args) else { return Ok(()) };
|
||||
|
@ -993,9 +1003,6 @@ pub fn print_flag_list<T>(
|
|||
/// So with all that in mind, the comments below have some more detail about the
|
||||
/// contortions done here to get things to work out correctly.
|
||||
pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
|
||||
// Throw away the first argument, the name of the binary
|
||||
let args = &args[1..];
|
||||
|
||||
if args.is_empty() {
|
||||
// user did not write `-v` nor `-Z unstable-options`, so do not
|
||||
// include that extra information.
|
||||
|
|
|
@ -321,7 +321,6 @@ impl Options {
|
|||
matches: &getopts::Matches,
|
||||
args: Vec<String>,
|
||||
) -> Result<(Options, RenderOptions), i32> {
|
||||
let args = &args[1..];
|
||||
// Check for unstable options.
|
||||
nightly_options::check_nightly_options(matches, &opts());
|
||||
|
||||
|
|
|
@ -703,13 +703,23 @@ fn run_renderer<'tcx, T: formats::FormatRenderer<'tcx>>(
|
|||
}
|
||||
|
||||
fn main_args(at_args: &[String]) -> MainResult {
|
||||
// Throw away the first argument, the name of the binary.
|
||||
// In case of at_args being empty, as might be the case by
|
||||
// passing empty argument array to execve under some platforms,
|
||||
// just use an empty slice.
|
||||
//
|
||||
// This situation was possible before due to arg_expand_all being
|
||||
// called before removing the argument, enabling a crash by calling
|
||||
// the compiler with @empty_file as argv[0] and no more arguments.
|
||||
let at_args = at_args.get(1..).unwrap_or_default();
|
||||
|
||||
let args = rustc_driver::args::arg_expand_all(at_args);
|
||||
|
||||
let mut options = getopts::Options::new();
|
||||
for option in opts() {
|
||||
(option.apply)(&mut options);
|
||||
}
|
||||
let matches = match options.parse(&args[1..]) {
|
||||
let matches = match options.parse(&args) {
|
||||
Ok(m) => m,
|
||||
Err(err) => {
|
||||
early_error(ErrorOutputType::default(), &err.to_string());
|
||||
|
|
Loading…
Add table
Reference in a new issue