From 873e7a59d7be7db56573eef271d23867e3dfa47b Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 11 Mar 2014 11:22:07 +0100 Subject: [PATCH] ipcs: fix size_t overflow Addresses: https://github.com/karelzak/util-linux/issues/51 Signed-off-by: Karel Zak --- sys-utils/ipcs.c | 2 +- sys-utils/ipcutils.c | 8 ++++---- sys-utils/ipcutils.h | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/sys-utils/ipcs.c b/sys-utils/ipcs.c index 16e520649e..90d6e0e996 100644 --- a/sys-utils/ipcs.c +++ b/sys-utils/ipcs.c @@ -201,7 +201,7 @@ static void do_shm (char format, int unit) _("max seg size"), lim.shmmax, "\n", 0); ipc_print_size(unit == IPC_UNIT_DEFAULT ? IPC_UNIT_KB : unit, _("max total shared memory"), - lim.shmall * getpagesize(), "\n", 0); + (uint64_t) lim.shmall * getpagesize(), "\n", 0); ipc_print_size(unit == IPC_UNIT_DEFAULT ? IPC_UNIT_BYTES : unit, _("min seg size"), lim.shmmin, "\n", 0); return; diff --git a/sys-utils/ipcutils.c b/sys-utils/ipcutils.c index 62d7428452..9ca986e1c9 100644 --- a/sys-utils/ipcutils.c +++ b/sys-utils/ipcutils.c @@ -508,10 +508,10 @@ void ipc_print_perms(FILE *f, struct ipc_stat *is) fprintf(f, " %-10u\n", is->gid); } -void ipc_print_size(int unit, char *msg, size_t size, const char *end, +void ipc_print_size(int unit, char *msg, uint64_t size, const char *end, int width) { - char format[16]; + char format[32]; if (!msg) /* NULL */ ; @@ -527,11 +527,11 @@ void ipc_print_size(int unit, char *msg, size_t size, const char *end, switch (unit) { case IPC_UNIT_DEFAULT: case IPC_UNIT_BYTES: - sprintf(format, "%%%dzu", width); + sprintf(format, "%%%dju", width); printf(format, size); break; case IPC_UNIT_KB: - sprintf(format, "%%%dzu", width); + sprintf(format, "%%%dju", width); printf(format, size / 1024); break; case IPC_UNIT_HUMAN: diff --git a/sys-utils/ipcutils.h b/sys-utils/ipcutils.h index d2e5972dd0..26fbbcf4de 100644 --- a/sys-utils/ipcutils.h +++ b/sys-utils/ipcutils.h @@ -12,6 +12,7 @@ #include #include #include +#include /* * SHM_DEST and SHM_LOCKED are defined in kernel headers, but inside @@ -118,7 +119,7 @@ struct ipc_stat { }; extern void ipc_print_perms(FILE *f, struct ipc_stat *is); -extern void ipc_print_size(int unit, char *msg, size_t size, const char *end, int width); +extern void ipc_print_size(int unit, char *msg, uint64_t size, const char *end, int width); /* See 'struct shmid_kernel' in kernel sources */ -- 2.47.2