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:
parent
7ef338f39d
commit
929c257548
|
@ -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"));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue