Skip to content

Commit

Permalink
Fix ICE when reading non-UTF-8 input from stdin
Browse files Browse the repository at this point in the history
Fixes #22387.
  • Loading branch information
varkor committed Jan 31, 2018
1 parent 90eb44a commit c739254
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
29 changes: 22 additions & 7 deletions src/librustc_driver/lib.rs
Expand Up @@ -456,10 +456,13 @@ pub fn run_compiler<'a>(args: &[String],
None);

let (odir, ofile) = make_output(&matches);
let (input, input_file_path) = match make_input(&matches.free) {
Some((input, input_file_path)) => callbacks.some_input(input, input_file_path),
let (input, input_file_path, input_err) = match make_input(&matches.free) {
Some((input, input_file_path, input_err)) => {
let (input, input_file_path) = callbacks.some_input(input, input_file_path);
(input, input_file_path, input_err)
},
None => match callbacks.no_input(&matches, &sopts, &cfg, &odir, &ofile, &descriptions) {
Some((input, input_file_path)) => (input, input_file_path),
Some((input, input_file_path)) => (input, input_file_path, None),
None => return (Ok(()), None),
},
};
Expand All @@ -470,6 +473,13 @@ pub fn run_compiler<'a>(args: &[String],
sopts, input_file_path.clone(), descriptions, codemap, emitter_dest,
);

if let Some(err) = input_err {
// Immediately stop compilation if there was an issue reading
// the input (for example if the input stream is not UTF-8).
sess.err(&format!("{}", err));
return (Err(CompileIncomplete::Stopped), Some(sess));
}

let trans = get_trans(&sess);

rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
Expand Down Expand Up @@ -512,17 +522,22 @@ fn make_output(matches: &getopts::Matches) -> (Option<PathBuf>, Option<PathBuf>)
}

// Extract input (string or file and optional path) from matches.
fn make_input(free_matches: &[String]) -> Option<(Input, Option<PathBuf>)> {
fn make_input(free_matches: &[String]) -> Option<(Input, Option<PathBuf>, Option<io::Error>)> {
if free_matches.len() == 1 {
let ifile = &free_matches[0];
if ifile == "-" {
let mut src = String::new();
io::stdin().read_to_string(&mut src).unwrap();
let err = if io::stdin().read_to_string(&mut src).is_err() {
Some(io::Error::new(io::ErrorKind::InvalidData,
"couldn't read from stdin, as it did not contain valid UTF-8"))
} else {
None
};
Some((Input::Str { name: FileName::Anon, input: src },
None))
None, err))
} else {
Some((Input::File(PathBuf::from(ifile)),
Some(PathBuf::from(ifile))))
Some(PathBuf::from(ifile)), None))
}
} else {
None
Expand Down
5 changes: 5 additions & 0 deletions src/test/run-make/stdin-non-utf8/Makefile
@@ -0,0 +1,5 @@
-include ../tools.mk

all:
echo '\xD2' | $(RUSTC) - 2>&1 \
| $(CGREP) "error: couldn't read from stdin, as it did not contain valid UTF-8"

0 comments on commit c739254

Please sign in to comment.