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