shmget: Make shmobj underwent IPC_RMID invisible to shmget
Refs: #926 Change-Id: I16120623b581da5d5d484fd05d5111788c8ad5e2
This commit is contained in:
committed by
Masamichi Takagi
parent
229b041320
commit
9bb8076dc0
@ -295,6 +295,7 @@ void shmobj_destroy(struct shmobj *obj)
|
||||
--the_shm_info.used_ids;
|
||||
|
||||
list_add(&obj->chain, &kds_free_list);
|
||||
/* For index reuse, release in descending order of index. */
|
||||
for (;;) {
|
||||
struct shmobj *p;
|
||||
|
||||
|
||||
@ -4758,7 +4758,8 @@ int shmobj_list_lookup_by_key(key_t key, struct shmobj **objp)
|
||||
struct shmobj *obj;
|
||||
|
||||
list_for_each_entry(obj, &kds_list, chain) {
|
||||
if (obj->ds.shm_perm.key == key) {
|
||||
if (obj->ds.shm_perm.key == key &&
|
||||
!(obj->ds.shm_perm.mode & SHM_DEST)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,80 @@
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
|
||||
void
|
||||
additional_test()
|
||||
{
|
||||
key_t key;
|
||||
int shmid1;
|
||||
int shmid2;
|
||||
int shmid3;
|
||||
int *sp1;
|
||||
int *sp2;
|
||||
int *sp3;
|
||||
int *sp4;
|
||||
struct shmid_ds buf;
|
||||
|
||||
key = ftok("/", 1);
|
||||
|
||||
if ((shmid1 = shmget(key, 4096, IPC_CREAT | 0660)) == -1) {
|
||||
perror("shmget 1");
|
||||
exit(1);
|
||||
}
|
||||
if ((sp1 = shmat(shmid1, NULL, 0)) == (void *)-1) {
|
||||
perror("shmat 1");
|
||||
exit(1);
|
||||
}
|
||||
if (shmctl(shmid1, IPC_RMID, &buf) == -1) {
|
||||
perror("RMID 1");
|
||||
exit(1);
|
||||
}
|
||||
*sp1 = 1;
|
||||
|
||||
if ((shmid2 = shmget(key, 4096, IPC_CREAT | 0660)) == -1) {
|
||||
perror("shmget 2");
|
||||
exit(1);
|
||||
}
|
||||
if ((sp2 = shmat(shmid2, NULL, 0)) == (void *)-1) {
|
||||
perror("shmat 2");
|
||||
exit(1);
|
||||
}
|
||||
*sp2 = 2;
|
||||
|
||||
printf("C926T09... ");
|
||||
if ((shmid3 = shmget(key, 4096, IPC_CREAT | 0660)) == -1) {
|
||||
perror("shmget 3");
|
||||
exit(1);
|
||||
}
|
||||
if ((sp3 = shmat(shmid3, NULL, 0)) == (void *)-1) {
|
||||
perror("shmat 3");
|
||||
exit(1);
|
||||
}
|
||||
if (shmid3 == shmid2 && *sp3 == 2) {
|
||||
printf("OK\n");
|
||||
}
|
||||
else {
|
||||
if (shmid3 != shmid2) {
|
||||
printf("NG shmid %d!=%d\n", shmid3, shmid2);
|
||||
}
|
||||
else {
|
||||
printf("NG valie=%d\n", *sp3);
|
||||
}
|
||||
}
|
||||
|
||||
printf("C926T10... ");
|
||||
if ((sp4 = shmat(shmid1, NULL, 0)) == (void *)-1) {
|
||||
perror("shmat 4");
|
||||
exit(1);
|
||||
}
|
||||
if (*sp4 == 1) {
|
||||
printf("OK\n");
|
||||
}
|
||||
else {
|
||||
printf("NG valie=%d\n", *sp4);
|
||||
}
|
||||
shmctl(shmid2, IPC_RMID, &buf);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -85,6 +159,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -150,6 +225,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -223,6 +299,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -294,6 +371,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -362,6 +440,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -428,6 +507,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -499,6 +579,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -569,6 +650,7 @@ main(int argc, char **argv)
|
||||
sp = shmat(shmid, NULL, 0);
|
||||
st = *sp == valid3? 1: 0;
|
||||
shmdt(sp);
|
||||
shmctl(shmid, IPC_RMID, &buf);
|
||||
exit(st);
|
||||
}
|
||||
|
||||
@ -583,5 +665,7 @@ main(int argc, char **argv)
|
||||
printf("NG\n");
|
||||
}
|
||||
|
||||
additional_test();
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
27
test/issues/926/C926.sh
Normal file
27
test/issues/926/C926.sh
Normal file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
BIN=
|
||||
SBIN=
|
||||
BOOTPARAM="-c 1-7 -m 2G@0"
|
||||
|
||||
if [ -f ../../../config.h ]; then
|
||||
str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'`
|
||||
eval $str
|
||||
fi
|
||||
|
||||
if [ -f ../../../Makefile ]; then
|
||||
str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'`
|
||||
eval $str
|
||||
fi
|
||||
|
||||
if [ "x$BINDIR" = x ];then
|
||||
BINDIR="$BIN"
|
||||
fi
|
||||
if [ "x$SBINDIR" = x ];then
|
||||
SBINDIR="$SBIN"
|
||||
fi
|
||||
|
||||
if ! lsmod | grep mcctrl > /dev/null 2>&1; then
|
||||
$SBINDIR/mcreboot.sh $BOOTPARAM
|
||||
fi
|
||||
|
||||
$BINDIR/mcexec ./C926
|
||||
@ -1,5 +1,7 @@
|
||||
スクリプトは Wed Jun 6 14:39:24 2018
|
||||
に開始しました[?1034hbash-4.2$ ./mcexec C[K./C926
|
||||
Script started on Thu Jun 28 09:11:00 2018
|
||||
bash-4.2$ make test
|
||||
gcc -o C926 C926.c -Wall -g
|
||||
sh ./C926.sh
|
||||
C926T01... OK
|
||||
C926T02... OK
|
||||
C926T03... OK
|
||||
@ -8,8 +10,9 @@ C926T05... OK
|
||||
C926T06... OK
|
||||
C926T07... OK
|
||||
C926T08... OK
|
||||
C926T09... OK
|
||||
C926T10... OK
|
||||
bash-4.2$ exit
|
||||
exit
|
||||
|
||||
スクリプトは Wed Jun 6 14:39:38 2018
|
||||
に終了しました
|
||||
Script done on Thu Jun 28 09:11:07 2018
|
||||
|
||||
13
test/issues/926/Makefile
Normal file
13
test/issues/926/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
CC=gcc
|
||||
TARGET=C926
|
||||
|
||||
all:: $(TARGET)
|
||||
|
||||
C926: C926.c
|
||||
$(CC) -o C926 C926.c -Wall -g
|
||||
|
||||
test:: $(TARGET)
|
||||
sh ./C926.sh
|
||||
|
||||
clean::
|
||||
rm -f *.o $(TARGET)
|
||||
26
test/issues/926/README
Normal file
26
test/issues/926/README
Normal file
@ -0,0 +1,26 @@
|
||||
【Issue#926 動作確認】
|
||||
□ テスト内容
|
||||
1. shmat, RMID, shmdtの組み合せ確認。shmat直前にshmget実行。()内は別プロセス。
|
||||
C926T01 shmat->shmdt->(shmat->shmdt)で同じ領域が使われていることを確認
|
||||
C926T02 shmat->exit->(shmat->shmdt)で同じ領域が使われていることを確認
|
||||
C926T03 shmat->RMID->(shmat)->shmdt->(shmdt)で別領域が使われることを確認
|
||||
C926T04 shmat->RMID->(shmat->shmdt)->shmdtで別領域が使われることを確認
|
||||
C926T05 shmat->RMID->shmdt->(shmat->shmdt)で別領域が使われることを確認
|
||||
C926T06 shmat->RMID->exit->(shmat->shmdt)で別領域が使われることを確認
|
||||
C926T07 shmat->(shmat)->RMID->exit->(shmdt)で同じ領域が使われることを確認
|
||||
C926T08 shmat->(shmat)->exit->(shmdt)で同じ領域が使われることを確認
|
||||
|
||||
2. shmgetとshmatの組み合せ確認。shmgetのキーは同じ。
|
||||
C926T09 shmget->shmat->RMID->shmget->shmatで別領域が使われることを確認
|
||||
C926T10 shmget->shmat->RMID->shmatで同じ領域が使われることを確認
|
||||
|
||||
□ 実行手順
|
||||
$ make test
|
||||
|
||||
実行できない場合は、C926.shの以下の行を適切に書き換えた後に実行。
|
||||
BIN= mcexec が存在するパス
|
||||
SBIN= mcreboot.sh が存在するパス
|
||||
|
||||
□ 実行結果
|
||||
C926.txt 参照。
|
||||
全ての項目が OK となっていることを確認。
|
||||
Reference in New Issue
Block a user