ipcs: fix shmctl() usage

The function shmctl() has to be called with 'struct shmid_ds', and if
you need 'struct shminfo' then the right way is to cast:

bad way:
  struct shm_info info;

  shmctl(0, SHM_INFO, &info);

right way:
  struct shmid_ds buf;
  struct shm_info *info;

  shmctl(0, SHM_INFO, &buf);
  info = (struct shm_info *) &buf);

The patch also fixes bug in ipc_shm_get_limits() where is missing
lim->shmmax in code based on shmctl().

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2014-12-19 13:42:41 +01:00
parent 7ef338f39d
commit 929c257548
3 changed files with 17 additions and 15 deletions

View File

@ -235,7 +235,6 @@ static int remove_all(type_id type)
int id, rm_me, maxid;
struct shmid_ds shmseg;
struct shm_info shm_info;
struct semid_ds semary;
struct seminfo seminfo;
@ -245,8 +244,7 @@ static int remove_all(type_id type)
struct msginfo msginfo;
if (type == SHM || type == ALL) {
maxid =
shmctl(0, SHM_INFO, (struct shmid_ds *)(void *)&shm_info);
maxid = shmctl(0, SHM_INFO, &shmseg);
if (maxid < 0)
errx(EXIT_FAILURE,
_("kernel not configured for shared memory"));

View File

@ -209,9 +209,11 @@ static void do_shm (char format, int unit)
case STATUS:
{
int maxid;
struct shm_info shm_info;
struct shmid_ds shmbuf;
struct shm_info *shm_info;
maxid = shmctl (0, SHM_INFO, (struct shmid_ds *) &shm_info);
maxid = shmctl (0, SHM_INFO, &shmbuf);
shm_info = (struct shm_info *) &shmbuf;
if (maxid < 0) {
printf (_("kernel not configured for shared memory\n"));
return;
@ -234,11 +236,11 @@ static void do_shm (char format, int unit)
"pages resident %ld\n"
"pages swapped %ld\n"
"Swap performance: %ld attempts\t %ld successes\n"),
shm_info.used_ids,
shm_info.shm_tot,
shm_info.shm_rss,
shm_info.shm_swp,
shm_info.swap_attempts, shm_info.swap_successes);
shm_info->used_ids,
shm_info->shm_tot,
shm_info->shm_rss,
shm_info->shm_swp,
shm_info->swap_attempts, shm_info->swap_successes);
return;
}

View File

@ -1,4 +1,3 @@
#include <inttypes.h>
#include "c.h"
@ -82,12 +81,15 @@ int ipc_shm_get_limits(struct ipc_limits *lim)
lim->shmmni = path_read_u64(_PATH_PROC_IPC_SHMMNI);
} else {
struct shminfo shminfo;
struct shminfo *shminfo;
struct shmid_ds shmbuf;
if (shmctl(0, IPC_INFO, (struct shmid_ds *) &shminfo) < 0)
if (shmctl(0, IPC_INFO, &shmbuf) < 0)
return 1;
lim->shmmni = shminfo.shmmni;
lim->shmall = shminfo.shmall;
shminfo = (struct shminfo *) &shmbuf;
lim->shmmni = shminfo->shmmni;
lim->shmall = shminfo->shmall;
lim->shmmax = shminfo->shmmax;
}
return 0;