diff --git a/kernel/shmobj.c b/kernel/shmobj.c index 473aaadb..2d30a854 100644 --- a/kernel/shmobj.c +++ b/kernel/shmobj.c @@ -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; diff --git a/kernel/syscall.c b/kernel/syscall.c index c243fd25..168831bb 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -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; } } diff --git a/test/issues/926/C926.c b/test/issues/926/C926.c index 40b220bd..c458427b 100644 --- a/test/issues/926/C926.c +++ b/test/issues/926/C926.c @@ -12,6 +12,80 @@ #include #include +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); } diff --git a/test/issues/926/C926.sh b/test/issues/926/C926.sh new file mode 100644 index 00000000..56c40925 --- /dev/null +++ b/test/issues/926/C926.sh @@ -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 diff --git a/test/issues/926/C926.txt b/test/issues/926/C926.txt index f77bf070..59d400dd 100644 --- a/test/issues/926/C926.txt +++ b/test/issues/926/C926.txt @@ -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 - に終了しました \ No newline at end of file +Script done on Thu Jun 28 09:11:07 2018 diff --git a/test/issues/926/Makefile b/test/issues/926/Makefile new file mode 100644 index 00000000..6f9b09d5 --- /dev/null +++ b/test/issues/926/Makefile @@ -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) diff --git a/test/issues/926/README b/test/issues/926/README new file mode 100644 index 00000000..655012c7 --- /dev/null +++ b/test/issues/926/README @@ -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 となっていることを確認。