From e1f204de4a2284518085a2c86c98cb6d6f46a323 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Fri, 29 Jun 2018 13:49:55 +0900 Subject: [PATCH] test: Add testcase for #1112 Refs: #1112 Change-Id: I0041366d8dcf035a09fbb59a5dbd5c94cae0d65e --- test/issues/1112/C1112.sh | 65 ++++++++++++++++++++++++++++++++++ test/issues/1112/CT_001.c | 43 +++++++++++++++++++++++ test/issues/1112/CT_002.c | 43 +++++++++++++++++++++++ test/issues/1112/CT_003.c | 43 +++++++++++++++++++++++ test/issues/1112/CT_004.c | 44 +++++++++++++++++++++++ test/issues/1112/CT_005.c | 43 +++++++++++++++++++++++ test/issues/1112/Makefile | 29 ++++++++++++++++ test/issues/1112/README | 69 +++++++++++++++++++++++++++++++++++++ test/issues/1112/result.log | 36 +++++++++++++++++++ test/issues/1112/test_chk.h | 23 +++++++++++++ 10 files changed, 438 insertions(+) create mode 100644 test/issues/1112/C1112.sh create mode 100644 test/issues/1112/CT_001.c create mode 100644 test/issues/1112/CT_002.c create mode 100644 test/issues/1112/CT_003.c create mode 100644 test/issues/1112/CT_004.c create mode 100644 test/issues/1112/CT_005.c create mode 100644 test/issues/1112/Makefile create mode 100644 test/issues/1112/README create mode 100644 test/issues/1112/result.log create mode 100644 test/issues/1112/test_chk.h diff --git a/test/issues/1112/C1112.sh b/test/issues/1112/C1112.sh new file mode 100644 index 00000000..82b9c5eb --- /dev/null +++ b/test/issues/1112/C1112.sh @@ -0,0 +1,65 @@ +#!/bin/sh +BIN= +SBIN= +OSTEST= +BOOTPARAM="-c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24" + +if [ -f ../../../config.h ]; then + str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'` + eval $str +fi +if [ "x$BINDIR" = x ];then + BINDIR="$BIN" +fi + +if [ -f ../../../Makefile ]; then + str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'` + eval $str +fi +if [ "x$SBINDIR" = x ];then + SBINDIR="$SBIN" +fi + +if [ -f $HOME/ostest/bin/test_mck ]; then + OSTESTDIR=$HOME/ostest/ +fi +if [ "x$OSTESTDIR" = x ]; then + OSTESTDIR="$OSTEST" +fi + +if [ ! -x $SBINDIR/mcstop+release.sh ]; then + echo mcstop+release: not found >&2 + exit 1 +fi +echo -n "mcstop+release.sh ... " +sudo $SBINDIR/mcstop+release.sh +echo "done" + +if [ ! -x $SBINDIR/mcreboot.sh ]; then + echo mcreboot: not found >&2 + exit 1 +fi +echo -n "mcreboot.sh $BOOTPARAM ... " +sudo $SBINDIR/mcreboot.sh $BOOTPARAM +echo "done" + +if [ ! -x $BINDIR/mcexec ]; then + echo mcexec: not found >&2 + exit 1 +fi + +echo "*** RT_001 start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s mremap_mmap_anon -n 1 2>&1 | tee ./RT_001.txt +if grep "RESULT: ok" ./RT_001.txt > /dev/null 2>&1 ; then + echo "*** RT_001: PASSED" +else + echo "*** RT_001: FAILED" +fi +echo "" + +sudo $BINDIR/mcexec ./CT_001 +sudo $BINDIR/mcexec ./CT_002 +sudo $BINDIR/mcexec ./CT_003 +sudo $BINDIR/mcexec ./CT_004 +sudo $BINDIR/mcexec ./CT_005 + diff --git a/test/issues/1112/CT_001.c b/test/issues/1112/CT_001.c new file mode 100644 index 00000000..df6c803a --- /dev/null +++ b/test/issues/1112/CT_001.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_001" +#define MAP_SIZE 0x2000000 + +int main(int argc, char **argv) +{ + void *map, *remap; + int __errno; + + printf("*** %s start *******************************\n", TEST_NAME); + + map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + OKNG(map == MAP_FAILED, "mmap returned :%p", map); + + errno = 0; + remap = mremap(map, MAP_SIZE, 0x3000000, MREMAP_MAYMOVE); + __errno = errno; + + OKNG(remap == MAP_FAILED, "mremap returned :%p" + " (expect return is valid addr)", remap); + OKNG(__errno != 0, "errno after mremap :%d" + " (expect error is 0)", __errno); + + printf("*** %s PASSED\n\n", TEST_NAME); + + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/issues/1112/CT_002.c b/test/issues/1112/CT_002.c new file mode 100644 index 00000000..7bade138 --- /dev/null +++ b/test/issues/1112/CT_002.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_002" +#define MAP_SIZE 0x2000000 + +int main(int argc, char **argv) +{ + void *map, *remap; + int __errno; + + printf("*** %s start *******************************\n", TEST_NAME); + + map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + OKNG(map == MAP_FAILED, "mmap returned :%p", map); + + errno = 0; + remap = mremap(map, MAP_SIZE, 0x800000, 0); + __errno = errno; + + OKNG(remap != map, "mremap returned :%p" + " (expect return is %p)", remap, map); + OKNG(__errno != 0, "errno after mremap :%d" + " (expect error is 0)", __errno); + + printf("*** %s PASSED\n\n", TEST_NAME); + + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/issues/1112/CT_003.c b/test/issues/1112/CT_003.c new file mode 100644 index 00000000..9d8ad623 --- /dev/null +++ b/test/issues/1112/CT_003.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_003" +#define MAP_SIZE 0x2000000 + +int main(int argc, char **argv) +{ + void *map, *remap; + int __errno; + + printf("*** %s start *******************************\n", TEST_NAME); + + map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + OKNG(map == MAP_FAILED, "mmap returned :%p", map); + + errno = 0; + remap = mremap(map, 0xffffffffffffe000, 0xffffffffffffe000, 0); + __errno = errno; + + OKNG(remap != map, "mremap returned :%p" + " (expect return is %p)", remap, map); + OKNG(__errno != 0, "errno after mremap :%d" + " (expect error is 0)", __errno); + + printf("*** %s PASSED\n\n", TEST_NAME); + + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/issues/1112/CT_004.c b/test/issues/1112/CT_004.c new file mode 100644 index 00000000..2abf86ee --- /dev/null +++ b/test/issues/1112/CT_004.c @@ -0,0 +1,44 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_004" +#define MAP_SIZE 0x2000000 + +int main(int argc, char **argv) +{ + void *map, *remap; + int __errno; + + printf("*** %s start *******************************\n", TEST_NAME); + + map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + OKNG(map == MAP_FAILED, "mmap returned :%p", map); + + errno = 0; + remap = mremap(map, 0xffffffffffffe000, 0xffffffffffffe000, + MREMAP_MAYMOVE | MREMAP_FIXED, map + 0x40000000); + __errno = errno; + + OKNG(remap != MAP_FAILED, "mremap returned :%p" + " (expect return is MAP_FAILED)", remap); + OKNG(__errno != EINVAL, "errno after mremap :%d" + " (expect error is EINVAL(%d))", __errno, EINVAL); + + printf("*** %s PASSED\n\n", TEST_NAME); + + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/issues/1112/CT_005.c b/test/issues/1112/CT_005.c new file mode 100644 index 00000000..87d254d7 --- /dev/null +++ b/test/issues/1112/CT_005.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_005" +#define MAP_SIZE 0x2000000 + +int main(int argc, char **argv) +{ + void *map, *remap; + int __errno; + + printf("*** %s start *******************************\n", TEST_NAME); + + map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + OKNG(map == MAP_FAILED, "mmap returned :%p", map); + + errno = 0; + remap = mremap(map, MAP_SIZE, 0xffffffffffffe000, MREMAP_MAYMOVE); + __errno = errno; + + OKNG(remap != MAP_FAILED, "mremap returned :%p" + " (expect return is MAP_FAILED)", remap); + OKNG(__errno != ENOMEM, "errno after mremap :%d" + " (expect error is ENOMEM(%d))", __errno, ENOMEM); + + printf("*** %s PASSED\n\n", TEST_NAME); + + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/issues/1112/Makefile b/test/issues/1112/Makefile new file mode 100644 index 00000000..aaf4b6f0 --- /dev/null +++ b/test/issues/1112/Makefile @@ -0,0 +1,29 @@ +CC = gcc +TARGET=CT_001 CT_002 CT_003 CT_004 CT_005 + +CPPFLAGS = +LDFLAGS = + +all: $(TARGET) + +CT_001: CT_001.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_002: CT_002.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_003: CT_003.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_004: CT_004.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_005: CT_005.c + $(CC) -o $@ $^ $(LDFLAGS) + +test: all + @sh ./C1112.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/issues/1112/README b/test/issues/1112/README new file mode 100644 index 00000000..d55e9441 --- /dev/null +++ b/test/issues/1112/README @@ -0,0 +1,69 @@ +【Issue#1112 動作確認】 +□ テスト内容 +1. Issueで報告された再現プログラムでの確認 +RT_001: ostest-rt_sigaction.004 による確認 + テストが正常に終了し、「RESULT: ok」が出力される + +2. 既存のmremap機能に影響がないことを確認 +CT_001: mremapによる領域の拡張 + 1. mmap で32MBの領域を確保 + 2. 下記条件でmremapを実行 + - old_addr : mmapで確保したアドレス + - old_size : 0x2000000 (32MB) + - new_size : 0x3000000 (64MB) + - flags : MREMAP_MAYMOVE + 3. mremap がMAP_FAILED以外の値を返す + 4. mremap がerrnoを設定しない + +CT_002: mremapによる領域の縮小 + 1. mmap で32MBの領域を確保 + 2. 下記条件でmremapを実行 + - old_addr : mmapで確保したアドレス + - old_size : 0x2000000 (32MB) + - new_size : 0x800000 (8MB) + - flags : 0 + 3. mremap がold_addr に指定した値を返す + 4. mremap がerrnoを設定しない + +CT_003: old/new_size 不正時の動作 + 1. mmap で32MBの領域を確保 + 2. 下記条件でmremapを実行 + - old_addr : mmapで確保したアドレス + - old_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値) + - new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値) + - flags : 0 + 3. mremap がold_addr に指定した値を返す + 4. mremap がerrnoを設定しない + +CT_004: old/new_size 不正時の動作 + 1. mmap で32MBの領域を確保 + 2. 下記条件でmremapを実行 + - old_addr : mmapで確保したアドレス + - old_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値) + - new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値) + - flags : MREMAP_MAYMOVE | MREMAP_FIXED + - new_addr : mmapで確保したアドレス + 0x40000000 (1GB) + 3. mremap がMAP_FAILED を返す + 4. mremap がerrnoにEINVALを設定する + +CT_005: old/new_size 不正時の動作 + 1. mmap で32MBの領域を確保 + 2. 下記条件でmremapを実行 + - old_addr : mmapで確保したアドレス + - old_size : 0x2000000 (32MB) + - new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値) + - flags : MREMAP_MAYMOVE + 3. mremap がMAP_FAILED を返す + 4. mremap がerrnoにENOMEMを設定する + +□ 実行手順 +$ make test + +実行できない場合は、C1112.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス +OSTEST= OSTESTが存在するパス + +□ 実行結果 +result.log 参照。 +すべての項目をPASSしていることを確認。 diff --git a/test/issues/1112/result.log b/test/issues/1112/result.log new file mode 100644 index 00000000..6c835e8a --- /dev/null +++ b/test/issues/1112/result.log @@ -0,0 +1,36 @@ +*** RT_001 start ******************************* +TEST_SUITE: mremap_mmap_anon +TEST_NUMBER: 1 +ARGS: +RESULT: ok +*** RT_001: PASSED + +*** CT_001 start ******************************* + [OK] mmap returned :0x2aaaab200000 + [OK] mremap returned :0x2aaaab200000 (expect return is valid addr) + [OK] errno after mremap :0 (expect error is 0) +*** CT_001 PASSED + +*** CT_002 start ******************************* + [OK] mmap returned :0x2aaaab200000 + [OK] mremap returned :0x2aaaab200000 (expect return is 0x2aaaab200000) + [OK] errno after mremap :0 (expect error is 0) +*** CT_002 PASSED + +*** CT_003 start ******************************* + [OK] mmap returned :0x2aaaab200000 + [OK] mremap returned :0x2aaaab200000 (expect return is 0x2aaaab200000) + [OK] errno after mremap :0 (expect error is 0) +*** CT_003 PASSED + +*** CT_004 start ******************************* + [OK] mmap returned :0x2aaaab200000 + [OK] mremap returned :0xffffffffffffffff (expect return is MAP_FAILED) + [OK] errno after mremap :22 (expect error is EINVAL(22)) +*** CT_004 PASSED + +*** CT_005 start ******************************* + [OK] mmap returned :0x2aaaab200000 + [OK] mremap returned :0xffffffffffffffff (expect return is MAP_FAILED) + [OK] errno after mremap :12 (expect error is ENOMEM(12)) +*** CT_005 PASSED diff --git a/test/issues/1112/test_chk.h b/test/issues/1112/test_chk.h new file mode 100644 index 00000000..4cef42e8 --- /dev/null +++ b/test/issues/1112/test_chk.h @@ -0,0 +1,23 @@ +#ifndef HEADER_TEST_CHK_H +#define HEADER_TEST_CHK_H + +#define CHKANDJUMP(cond, ...) do {\ + if (cond) {\ + fprintf(stderr, " [NG] ");\ + fprintf(stderr, __VA_ARGS__);\ + fprintf(stderr, " failed\n");\ + goto fn_fail;\ + } \ + } while (0) + +#define OKNG(cond, ...) do {\ + if (cond) {\ + CHKANDJUMP(cond, __VA_ARGS__);\ + } else {\ + fprintf(stdout, " [OK] ");\ + fprintf(stdout, __VA_ARGS__);\ + fprintf(stdout, "\n");\ + } \ + } while (0) + +#endif