Alexandre "Sunny" Kovalenko
2008-Jun-29 21:26 UTC
expand_number(3) silently truncates numeric part of the argument to 32 bit on i386, light impact on gjournal
I honestly don't know whether it should or should not do it, and if it should not, what errno should be set to. Program below gives following output on RELENG_7 as of June 28th: sunny:RabbitsDen>./expand_number 5368709120k Result is 1099511627776 sunny:RabbitsDen>./expand_number 5120G Result is 5497558138880 sunny:RabbitsDen> One of the more interesting manifestations in the userland is that gjournal label -s 5368709120 -f /dev/da0s1a quietly gives you 1G of the journal in the resulting file system. Cut here>----------------------------------------------------------- #include <ctype.h> #include <sys/types.h> #include <inttypes.h> #include <errno.h> #include <libutil.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc != 2) { fprintf(stderr, "Usage: %s <number>\n", argv[0]); exit(1); } errno = 0; intmax_t result; if(expand_number(argv[1], &result) || errno) { perror("Expand number"); exit(1); } printf("Result is %jd\n", result); exit(0); } ?Cut here>----------------------------------------------------------- -- Alexandre "Sunny" Kovalenko (????????? ?????????)
Jilles Tjoelker
2008-Jul-06 11:15 UTC
expand_number(3) silently truncates numeric part of the argument to 32 bit on i386, light impact on gjournal
On Sun, Jun 29, 2008 at 04:16:25PM -0400, Alexandre Sunny Kovalenko wrote:> I honestly don't know whether it should or should not do it, and if it > should not, what errno should be set to. Program below gives following > output on RELENG_7 as of June 28th:> sunny:RabbitsDen>./expand_number 5368709120k > Result is 1099511627776 > sunny:RabbitsDen>./expand_number 5120G > Result is 5497558138880 > sunny:RabbitsDen>> One of the more interesting manifestations in the userland is that> gjournal label -s 5368709120 -f /dev/da0s1a> quietly gives you 1G of the journal in the resulting file system. > [snip program calling expand_number(3)]This happens because src/lib/libutil/expand_number.c does not include the necessary header <inttypes.h> for calling strtoimax(3). The file is compiled without compiler warnings, so the bug shows up as wrong behaviour. Adding #include <inttypes.h> fixes it. The file is slightly changed in CURRENT but the same patch should apply. -- Jilles Tjoelker -------------- next part -------------- A non-text attachment was scrubbed... Name: expand_number.patch Type: text/x-diff Size: 322 bytes Desc: not available Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20080706/4ded021b/expand_number.bin