shmget: Make shmobj underwent IPC_RMID invisible to shmget

Refs: #926
Change-Id: I16120623b581da5d5d484fd05d5111788c8ad5e2
This commit is contained in:
Tomoki Shirasawa
2018-06-11 11:40:48 +09:00
committed by Masamichi Takagi
parent 229b041320
commit 9bb8076dc0
7 changed files with 170 additions and 15 deletions

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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
View 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

View File

@ -1,15 +1,18 @@
スクリプトは Wed Jun 6 14:39:24 2018
に開始しました[?1034hbash-4.2$ ./mcexec C./C926
C926T01... OK
C926T02... OK
C926T03... OK
C926T04... OK
C926T05... OK
C926T06... OK
C926T07... OK
C926T08... OK
bash-4.2$ exit
exit
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
C926T04... OK
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
View 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
View 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 となっていることを確認。