Issue#923: add test cases

This commit is contained in:
Tomoki Shirasawa
2018-03-15 10:13:16 +09:00
parent fe42481d6f
commit 9da9e755fa
6 changed files with 3107 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View 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);
}

View 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
に終了しました

View 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);
}

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

View 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件)