about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2017-08-05 23:54:48 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2017-08-06 21:30:39 +0200
commit26dd77f4f3ec4adfa22cb6dfd25fafc5b55b7466 (patch)
treed1c2b92b18d1a65159ae8f4d6bbc54c0b0031c94
parent5a5a32a4a82027b3f4112919fa307dbae744069b (diff)
downloadrust-26dd77f4f3ec4adfa22cb6dfd25fafc5b55b7466.tar.gz
rust-26dd77f4f3ec4adfa22cb6dfd25fafc5b55b7466.zip
Fix hoedown error in rustdoc
-rw-r--r--src/librustdoc/html/markdown.rs15
-rw-r--r--src/test/rustdoc/nul-error.rs18
2 files changed, 25 insertions, 8 deletions
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 03da451fd9a..cd58ff3109f 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -32,7 +32,6 @@ use std::ascii::AsciiExt;
 use std::cell::RefCell;
 use std::collections::{HashMap, VecDeque};
 use std::default::Default;
-use std::ffi::CString;
 use std::fmt::{self, Write};
 use std::str;
 use syntax::feature_gate::UnstableFeatures;
@@ -531,6 +530,7 @@ extern {
     fn hoedown_buffer_new(unit: libc::size_t) -> *mut hoedown_buffer;
     fn hoedown_buffer_puts(b: *mut hoedown_buffer, c: *const libc::c_char);
     fn hoedown_buffer_free(b: *mut hoedown_buffer);
+    fn hoedown_buffer_put(b: *mut hoedown_buffer, c: *const libc::c_char, len: libc::size_t);
 }
 
 impl hoedown_buffer {
@@ -620,8 +620,7 @@ pub fn render(w: &mut fmt::Formatter,
                                Some("rust-example-rendered"),
                                None,
                                playground_button.as_ref().map(String::as_str)));
-                let output = CString::new(s).unwrap();
-                hoedown_buffer_puts(ob, output.as_ptr());
+                hoedown_buffer_put(ob, s.as_ptr() as *const libc::c_char, s.len());
             })
         }
     }
@@ -681,8 +680,7 @@ pub fn render(w: &mut fmt::Formatter,
                            <a href='#{id}'>{sec}{}</a></h{lvl}>",
                            s, lvl = level, id = id, sec = sec);
 
-        let text = CString::new(text).unwrap();
-        unsafe { hoedown_buffer_puts(ob, text.as_ptr()) }
+        unsafe { hoedown_buffer_put(ob, text.as_ptr() as *const libc::c_char, text.len()); }
     }
 
     extern fn codespan(
@@ -699,9 +697,10 @@ pub fn render(w: &mut fmt::Formatter,
             collapse_whitespace(s)
         };
 
-        let content = format!("<code>{}</code>", Escape(&content));
-        let element = CString::new(content).unwrap();
-        unsafe { hoedown_buffer_puts(ob, element.as_ptr()); }
+        let content = format!("<code>{}</code>", Escape(&content)).replace("\0", "\\0");
+        unsafe {
+            hoedown_buffer_put(ob, content.as_ptr() as *const libc::c_char, content.len());
+        }
         // Return anything except 0, which would mean "also print the code span verbatim".
         1
     }
diff --git a/src/test/rustdoc/nul-error.rs b/src/test/rustdoc/nul-error.rs
new file mode 100644
index 00000000000..f20d19d0e59
--- /dev/null
+++ b/src/test/rustdoc/nul-error.rs
@@ -0,0 +1,18 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// build-aux-docs
+// ignore-cross-compile
+
+#![crate_name = "foo"]
+
+// @has foo/fn.foo.html '//code' '0'
+#[doc = "Attempted to pass a string containing `\0`"]
+pub fn foo() {}