about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTycho Sci <tychosci@gmail.com>2012-10-18 22:11:03 +0900
committerTycho Sci <tychosci@gmail.com>2012-10-18 23:27:55 +0900
commitc0cee3ebe47d4fca73cdab23889322c5e47f12e5 (patch)
tree5c121f365ae71f52b631cba8309c0dbb45be3b76
parente28a161b720e267c837905e5f1b0760f71ebee14 (diff)
downloadrust-c0cee3ebe47d4fca73cdab23889322c5e47f12e5.tar.gz
rust-c0cee3ebe47d4fca73cdab23889322c5e47f12e5.zip
libcore: Make run::program_output UTF-8 safe
-rw-r--r--src/libcore/run.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/libcore/run.rs b/src/libcore/run.rs
index 06b86930630..cb6a7f737f9 100644
--- a/src/libcore/run.rs
+++ b/src/libcore/run.rs
@@ -248,12 +248,14 @@ pub fn start_program(prog: &str, args: &[~str]) -> Program {
 }
 
 fn read_all(rd: io::Reader) -> ~str {
-    let mut buf = ~"";
-    while !rd.eof() {
-        let bytes = rd.read_bytes(4096u);
-        buf += str::from_bytes(bytes);
-    }
-    move buf
+    let buf = io::with_bytes_writer(|wr| {
+        let mut bytes = [mut 0, ..4096];
+        while !rd.eof() {
+            let nread = rd.read(bytes, bytes.len());
+            wr.write(bytes.view(0, nread));
+        }
+    });
+    str::from_bytes(buf)
 }
 
 /**
@@ -341,13 +343,15 @@ fn writeclose(fd: c_int, s: ~str) {
 fn readclose(fd: c_int) -> ~str {
     let file = os::fdopen(fd);
     let reader = io::FILE_reader(file, false);
-    let mut buf = ~"";
-    while !reader.eof() {
-        let bytes = reader.read_bytes(4096u);
-        buf += str::from_bytes(bytes);
-    }
+    let buf = io::with_bytes_writer(|writer| {
+        let mut bytes = [mut 0, ..4096];
+        while !reader.eof() {
+            let nread = reader.read(bytes, bytes.len());
+            writer.write(bytes.view(0, nread));
+        }
+    });
     os::fclose(file);
-    move buf
+    str::from_bytes(buf)
 }
 
 /// Waits for a process to exit and returns the exit code