瀏覽代碼

Fix regressing in printf padding with space

There was bug in printf where space paddings cause segfault,
the problem was that it was pulled from the stack twice while it should
be only done once.
oddcoder 5 年之前
父節點
當前提交
4a47bc4a6f
共有 1 個文件被更改,包括 4 次插入3 次删除
  1. 4 3
      src/header/stdio/printf.rs

+ 4 - 3
src/header/stdio/printf.rs

@@ -472,7 +472,6 @@ struct PrintfArg {
     sign_always: bool,
     sign_always: bool,
     min_width: Number,
     min_width: Number,
     precision: Option<Number>,
     precision: Option<Number>,
-    pad_space: Number,
     pad_zero: Number,
     pad_zero: Number,
     intkind: IntKind,
     intkind: IntKind,
     fmt: u8,
     fmt: u8,
@@ -596,7 +595,6 @@ impl Iterator for PrintfIter {
                 sign_always,
                 sign_always,
                 min_width,
                 min_width,
                 precision,
                 precision,
-                pad_space,
                 pad_zero,
                 pad_zero,
                 intkind,
                 intkind,
                 fmt,
                 fmt,
@@ -667,8 +665,11 @@ unsafe fn inner_printf<W: Write>(w: W, format: *const c_char, mut ap: VaList) ->
         let sign_always = arg.sign_always;
         let sign_always = arg.sign_always;
         let min_width = arg.min_width.resolve(&mut varargs, &mut ap);
         let min_width = arg.min_width.resolve(&mut varargs, &mut ap);
         let precision = arg.precision.map(|n| n.resolve(&mut varargs, &mut ap));
         let precision = arg.precision.map(|n| n.resolve(&mut varargs, &mut ap));
-        let pad_space = arg.pad_space.resolve(&mut varargs, &mut ap);
         let pad_zero = arg.pad_zero.resolve(&mut varargs, &mut ap);
         let pad_zero = arg.pad_zero.resolve(&mut varargs, &mut ap);
+        let pad_space = match pad_zero {
+            0 => min_width,
+            _ => 0,
+        };
         let intkind = arg.intkind;
         let intkind = arg.intkind;
         let fmt = arg.fmt;
         let fmt = arg.fmt;
         let fmtkind = arg.fmtkind;
         let fmtkind = arg.fmtkind;