The following changes since commit fd98fb689d5ad7e9977461e961fff3fdd37f9cb8: Kill fusion atomic write engine (2018-09-08 08:09:53 -0600) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to ed06328df452330b7210db2558ae125f6e0d8fe2: Merge branch 'master' of https://github.com/bvanassche/fio (2018-09-09 17:42:10 -0600) ---------------------------------------------------------------- Bart Van Assche (3): iolog: Ensure that sockaddr_un.sun_path is '\0'-terminated Micro-optimize num2str() num2str(): Avoid an out-of-bounds array access Jens Axboe (1): Merge branch 'master' of https://github.com/bvanassche/fio iolog.c | 5 ++++- lib/num2str.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) --- Diff of recent changes: diff --git a/iolog.c b/iolog.c index f3eedb5..26c3458 100644 --- a/iolog.c +++ b/iolog.c @@ -580,7 +580,10 @@ static int open_socket(const char *path) if (fd < 0) return fd; addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, path, sizeof(addr.sun_path)); + if (snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", path) >= + sizeof(addr.sun_path)) + log_err("%s: path name %s is too long for a Unix socket\n", + __func__, path); if (connect(fd, (const struct sockaddr *)&addr, strlen(path) + sizeof(addr.sun_family)) == 0) return fd; else diff --git a/lib/num2str.c b/lib/num2str.c index 40fb3ae..1abe22f 100644 --- a/lib/num2str.c +++ b/lib/num2str.c @@ -30,7 +30,7 @@ char *num2str(uint64_t num, int maxlen, int base, int pow2, enum n2s_unit units) [N2S_BYTEPERSEC]= "B/s", [N2S_BITPERSEC] = "bit/s" }; - const unsigned int thousand[] = { 1000, 1024 }; + const unsigned int thousand = pow2 ? 1024 : 1000; unsigned int modulo; int post_index, carry = 0; char tmp[32], fmt[32]; @@ -49,7 +49,7 @@ char *num2str(uint64_t num, int maxlen, int base, int pow2, enum n2s_unit units) unitprefix = sistr; for (post_index = 0; base > 1; post_index++) - base /= thousand[!!pow2]; + base /= thousand; switch (units) { case N2S_NONE: @@ -72,14 +72,14 @@ char *num2str(uint64_t num, int maxlen, int base, int pow2, enum n2s_unit units) * Divide by K/Ki until string length of num <= maxlen. */ modulo = -1U; - while (post_index < sizeof(sistr)) { + while (post_index < ARRAY_SIZE(sistr)) { sprintf(tmp, "%llu", (unsigned long long) num); if (strlen(tmp) <= maxlen) break; - modulo = num % thousand[!!pow2]; - num /= thousand[!!pow2]; - carry = modulo >= thousand[!!pow2] / 2; + modulo = num % thousand; + num /= thousand; + carry = modulo >= thousand / 2; post_index++; } @@ -110,9 +110,9 @@ done: * Fill in everything and return the result. */ assert(maxlen - strlen(tmp) - 1 > 0); - assert(modulo < thousand[!!pow2]); + assert(modulo < thousand); sprintf(fmt, "%%.%df", (int)(maxlen - strlen(tmp) - 1)); - sprintf(tmp, fmt, (double)modulo / (double)thousand[!!pow2]); + sprintf(tmp, fmt, (double)modulo / (double)thousand); sprintf(buf, "%llu.%s%s%s", (unsigned long long) num, &tmp[2], unitprefix[post_index], unitstr[units]);