Issue #9861 has been updated by Nobuyoshi Nakada.

Status changed from Assigned to Closed
% Done changed from 0 to 100

Applied in changeset r46098.

----------
vsnprintf.c: fix string precision

* vsnprintf.c (BSD_vfprintf): fix string width when precision is
  given.  as the result of `memchr` is NULL or its offset from the
  start cannot exceed the size, the comparison was always false.
  [ruby-core:62737] [Bug #9861]

----------------------------------------
Bug #9861: BSD_vfprintf precsion doesn't work at shorter string
https://bugs.ruby-lang.org/issues/9861#change-46863

* Author: Nobuyoshi Nakada
* Status: Closed
* Priority: Normal
* Assignee: Nobuyoshi Nakada
* Category: core
* Target version: current: 2.2.0
* ruby -v: 1.4.0 or later
* Backport: 2.0.0: REQUIRED, 2.1: REQUIRED
----------------------------------------
`ruby_snprintf`などで`"%s"`に精度を指定してその精度よりも短い文字列を渡すと、本来の長さが無視されて精度まで`'\0'`が詰められます。

~~~C
/* t.c */
#include <ruby/ruby.h>

int main(void)
{
    char buf[26];
    ruby_snprintf(buf, sizeof(buf), "%.2s", "s");
    printf("[%.2x][%.2x][%.2x]\n", buf[0], buf[1], buf[2]);
    return 0;
}
~~~

~~~
$ make t LDLIBS='$(LIBRUBYARG_STATIC) $(LIBS)'
$ ./t
[73][00][00]
~~~

最初の`missing/vsnprintf.c`からあるようなので、1.4.0以降すべてのバージョンにあるバグだと思います。



-- 
https://bugs.ruby-lang.org/