Issue#923: add test cases
This commit is contained in:
2718
test/mng_mod/issues/923/CT01001.txt
Normal file
2718
test/mng_mod/issues/923/CT01001.txt
Normal file
File diff suppressed because it is too large
Load Diff
198
test/mng_mod/issues/923/CT02.c
Normal file
198
test/mng_mod/issues/923/CT02.c
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
readline(int fd, char *buf)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
while ((r = read(fd, buf, 1)) == 1) {
|
||||||
|
rc++;
|
||||||
|
if (*buf == '\n')
|
||||||
|
break;
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
if (r == -1) {
|
||||||
|
perror("read");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (!rc) {
|
||||||
|
fprintf(stderr, "CT02 read: BAD EOF\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int fds[2];
|
||||||
|
pid_t mcexec;
|
||||||
|
struct stat sb;
|
||||||
|
char line[80];
|
||||||
|
char *m;
|
||||||
|
struct iovec rvec[1];
|
||||||
|
struct iovec lvec[1];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (syscall(732) != -1) {
|
||||||
|
fprintf(stderr, "run under Linux!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stat("CT02m", &sb) == -1) {
|
||||||
|
fprintf(stderr, "no CT02m found\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
||||||
|
perror("socketpair");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mcexec = fork()) == 0) {
|
||||||
|
char param[10];
|
||||||
|
char *args[4];
|
||||||
|
|
||||||
|
close(fds[1]);
|
||||||
|
args[0] = "mcexec";
|
||||||
|
args[1] = "./CT02m";
|
||||||
|
sprintf(param, "%d", fds[0]);
|
||||||
|
args[2] = param;
|
||||||
|
args[3] = NULL;
|
||||||
|
if (stat("mcexec", &sb) == -1) {
|
||||||
|
execvp("mcexec", args);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
execv("./mcexec", args);
|
||||||
|
}
|
||||||
|
perror("execvp");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (mcexec == -1) {
|
||||||
|
perror("fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
close(fds[0]);
|
||||||
|
|
||||||
|
rvec[0].iov_len = 8;
|
||||||
|
lvec[0].iov_base = line;
|
||||||
|
lvec[0].iov_len = 8;
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_readv(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc != -1 || errno != EFAULT) {
|
||||||
|
fprintf(stderr, "CT02001 NG process_vm_readv rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02001 OK process_vm_readv failed\n");
|
||||||
|
}
|
||||||
|
if (strcmp(line, "ABCDEFG")) {
|
||||||
|
fprintf(stderr, "CT02002 NG broken data: %s\n", line);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02002 OK no data updated\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
write(fds[1], "\n", 1);
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_readv(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc == -1) {
|
||||||
|
fprintf(stderr, "CT02003 NG process_vm_readv rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02003 OK process_vm_readv was success\n");
|
||||||
|
}
|
||||||
|
if (strcmp(line, "1234567")) {
|
||||||
|
fprintf(stderr, "CT02004 NG broken data: %s\n", line);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02004 OK data updated\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
write(fds[1], "\n", 1);
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_readv(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc != -1 || errno != EFAULT) {
|
||||||
|
fprintf(stderr, "CT02005 NG process_vm_readv rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02005 OK process_vm_readv failed after munmap\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
write(fds[1], "\n", 1);
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_writev(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc != -1 || errno != EFAULT) {
|
||||||
|
fprintf(stderr, "CT02006 NG process_vm_writev rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02006 OK process_vm_writev failed\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
write(fds[1], "\n", 1);
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_writev(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc == -1) {
|
||||||
|
fprintf(stderr, "CT02008 NG process_vm_writev rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02008 OK process_vm_writev was success\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
write(fds[1], "\n", 1);
|
||||||
|
|
||||||
|
readline(fds[1], line);
|
||||||
|
sscanf(line, "%p", &m);
|
||||||
|
|
||||||
|
strcpy(line, "ABCDEFG");
|
||||||
|
rvec[0].iov_base = m;
|
||||||
|
rc = process_vm_writev(mcexec, lvec, 1, rvec, 1, 0);
|
||||||
|
if (rc != -1 || errno != EFAULT) {
|
||||||
|
fprintf(stderr, "CT02010 NG process_vm_writev rc=%d errno=%d\n", rc, errno);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02010 OK process_vm_writev failed after munmap\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
18
test/mng_mod/issues/923/CT02XXX.txt
Normal file
18
test/mng_mod/issues/923/CT02XXX.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
スクリプトは Thu Mar 15 10:12:07 2018
|
||||||
|
に開始しました[?1034hbash-4.2$ make test
|
||||||
|
./CT02
|
||||||
|
CT02001 OK process_vm_readv failed
|
||||||
|
CT02002 OK no data updated
|
||||||
|
CT02003 OK process_vm_readv was success
|
||||||
|
CT02004 OK data updated
|
||||||
|
CT02005 OK process_vm_readv failed after munmap
|
||||||
|
CT02006 OK process_vm_writev failed
|
||||||
|
CT02007 OK no data updated
|
||||||
|
CT02008 OK process_vm_writev was success
|
||||||
|
CT02009 OK data updated
|
||||||
|
CT02010 OK process_vm_writev failed after munmap
|
||||||
|
bash-4.2$ exit
|
||||||
|
exit
|
||||||
|
|
||||||
|
スクリプトは Thu Mar 15 10:12:13 2018
|
||||||
|
に終了しました
|
||||||
124
test/mng_mod/issues/923/CT02m.c
Normal file
124
test/mng_mod/issues/923/CT02m.c
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
readline(int fd, char *buf)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
while ((r = read(fd, buf, 1)) == 1) {
|
||||||
|
rc++;
|
||||||
|
if (*buf == '\n')
|
||||||
|
break;
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
if (r == -1) {
|
||||||
|
perror("read");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (!rc) {
|
||||||
|
fprintf(stderr, "CT02m read: BAD EOF\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
char buf[80];
|
||||||
|
char *m;
|
||||||
|
int f;
|
||||||
|
|
||||||
|
if (syscall(732) == -1) {
|
||||||
|
fprintf(stderr, "run under Mckernel!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv[1] == NULL) {
|
||||||
|
fprintf(stderr, "No parameter\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = atoi(argv[1]);
|
||||||
|
|
||||||
|
m = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
if (m == (void *)-1) {
|
||||||
|
perror("mmap");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CT02001
|
||||||
|
sprintf(buf, "%p 1\n", m);
|
||||||
|
strcpy(m, "1234567");
|
||||||
|
write(fd, buf, strlen(buf));
|
||||||
|
|
||||||
|
readline(fd, buf);
|
||||||
|
// CT02003
|
||||||
|
f = open("/dev/zero", O_RDONLY);
|
||||||
|
read(f, m, 4096);
|
||||||
|
close(f);
|
||||||
|
sprintf(buf, "%p 2\n", m);
|
||||||
|
strcpy(m, "1234567");
|
||||||
|
write(fd, buf, strlen(buf));
|
||||||
|
|
||||||
|
readline(fd, buf);
|
||||||
|
|
||||||
|
// CT02005
|
||||||
|
munmap(m, 4096);
|
||||||
|
sprintf(buf, "%p 3\n", m);
|
||||||
|
write(fd, buf, strlen(buf));
|
||||||
|
|
||||||
|
readline(fd, buf);
|
||||||
|
|
||||||
|
m = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||||
|
if (m == (void *)-1) {
|
||||||
|
perror("mmap");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CT02006
|
||||||
|
sprintf(buf, "%p\n", m);
|
||||||
|
strcpy(m, "1234567");
|
||||||
|
write(fd, buf, strlen(buf));
|
||||||
|
|
||||||
|
readline(fd, buf);
|
||||||
|
if (strcmp(m, "1234567")) {
|
||||||
|
fprintf(stderr, "CT02007 NG broken data: %s\n", m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02007 OK no data updated\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
// CT02008
|
||||||
|
f = open("/dev/zero", O_RDONLY);
|
||||||
|
read(f, m, 4096);
|
||||||
|
close(f);
|
||||||
|
sprintf(buf, "%p\n", m);
|
||||||
|
strcpy(m, "1234567");
|
||||||
|
write(fd, buf, strlen(buf));
|
||||||
|
|
||||||
|
readline(fd, buf);
|
||||||
|
if (strcmp(m, "ABCDEFG")) {
|
||||||
|
fprintf(stderr, "CT02009 NG broken data: %s\n", m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "CT02009 OK data updated\n");
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
// CT02010
|
||||||
|
munmap(m, 4096); sprintf(buf, "%p 6\n", m); write(fd, buf, strlen(buf));
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
18
test/mng_mod/issues/923/Makefile
Normal file
18
test/mng_mod/issues/923/Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CC = gcc
|
||||||
|
|
||||||
|
TARGET=CT02 CT02m
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
CT02: CT02.c
|
||||||
|
$(CC) -o CT02 CT02.c
|
||||||
|
|
||||||
|
CT02m: CT02m.c
|
||||||
|
$(CC) -o CT02m CT02m.c
|
||||||
|
|
||||||
|
test: all
|
||||||
|
./CT02
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
||||||
|
|
||||||
31
test/mng_mod/issues/923/README
Normal file
31
test/mng_mod/issues/923/README
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
【Issue#923 動作確認】
|
||||||
|
1. Issue#923 に報告されている手順で現象が解消したことを確認した。(1件)
|
||||||
|
実行結果(エビデンス)は以下の通り。
|
||||||
|
|
||||||
|
CT01001.txt Issue#923 に報告されている手順の実行結果(OK 1件、NG 0件)
|
||||||
|
|
||||||
|
2. LinuxからMcKernelのユーザ空間を参照するテストプログラムを新規に作成し、
|
||||||
|
LinuxからMcKernelのユーザ空間にアクセスしても異常が起きないことを確認
|
||||||
|
した。確認内容は以下の通り。
|
||||||
|
|
||||||
|
CT02001 McKernelでmmapした領域を即座にLinuxからprocess_vm_readvで参照した
|
||||||
|
とき、process_vm_readvがEFAULTでエラーとなること。
|
||||||
|
CT02002 CT02001の結果、Linuxの領域に変化が無いこと。
|
||||||
|
CT02003 CT02001でmmapした領域をシステムコール移譲でアクセスした後、 Linux
|
||||||
|
からprocess_vm_readvで参照したとき、process_vm_readvが成功すること。
|
||||||
|
CT02004 CT02003の結果、Linuxの領域にMcKernelのデータがコピーされていること。
|
||||||
|
CT02005 CT02001でmmapした領域をmunmapした後、Linuxからprocess_vm_readvで参照
|
||||||
|
したとき、process_vm_readvがEFAULTでエラーとなること。
|
||||||
|
CT02006 McKernelでmmapした領域を即座にLinuxからprocess_vm_writevで参照した
|
||||||
|
とき、process_vm_writevがEFAULTでエラーとなること。
|
||||||
|
CT02007 CT02001の結果、McKernelの領域に変化が無いこと。
|
||||||
|
CT02008 CT02001でmmapした領域をシステムコール移譲でアクセスした後、 Linux
|
||||||
|
からprocess_vm_writevで参照したとき、process_vm_writevが成功すること。
|
||||||
|
CT02009 CT02003の結果、McKernelの領域にLinuxのデータがコピーされていること。
|
||||||
|
CT02010 CT02001でmmapした領域をmunmapした後、Linuxからprocess_vm_writevで参照
|
||||||
|
したとき、process_vm_writevがEFAULTでエラーとなること。
|
||||||
|
|
||||||
|
CT02xxx の実行は make test で行う。このとき、mcexec を PATH に含めるか、
|
||||||
|
カレントディレクトリにリンクを作成しておくこと。
|
||||||
|
エビデンスは CT02XXX.txt に示す。(OK 10件、NG 0件)
|
||||||
|
|
||||||
Reference in New Issue
Block a user