]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
ipcs: fix size_t overflow
authorKarel Zak <kzak@redhat.com>
Tue, 11 Mar 2014 10:22:07 +0000 (11:22 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 11 Mar 2014 10:22:07 +0000 (11:22 +0100)
Addresses: https://github.com/karelzak/util-linux/issues/51
Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/ipcs.c
sys-utils/ipcutils.c
sys-utils/ipcutils.h

index 16e520649e2d83f9c2fe599ab2b614e6d0596cb7..90d6e0e9961ca6032a0707901620bd2c2f669a28 100644 (file)
@@ -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;
index 62d742845219f33327376993bdb68baf5abc2545..9ca986e1c92ebc18f8f2c04beee804b254137ccc 100644 (file)
@@ -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:
index d2e5972dd02a183ff6f9be97af84dcf85652903a..26fbbcf4dee99659f0485d0d55070655707107f2 100644 (file)
@@ -12,6 +12,7 @@
 #include <unistd.h>
 #include <grp.h>
 #include <pwd.h>
+#include <stdint.h>
 
 /*
  * 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
  */