87 lines
2.8 KiB
C
87 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <sys/mman.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
|
|
int main() {
|
|
printf("=== DragonOS Exception Table Test ===\n\n");
|
|
|
|
// 测试1: open() 使用未映射的路径指针
|
|
printf("Test 1: open() with unmapped path pointer\n");
|
|
char *bad_path = (char *)0x1000; // 未映射地址
|
|
|
|
int fd = open(bad_path, O_RDONLY);
|
|
if (fd == -1 && errno == EFAULT) {
|
|
printf(" ✓ PASS: open returned -1 with EFAULT\n");
|
|
} else {
|
|
printf(" ✗ FAIL: open returned %d, errno=%d\n", fd, errno);
|
|
if (fd >= 0) close(fd);
|
|
}
|
|
|
|
// 测试2: open() 使用已释放的内存作为路径
|
|
printf("\nTest 2: open() with freed memory path\n");
|
|
void *mem = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
if (mem == MAP_FAILED) {
|
|
printf(" ✗ FAIL: mmap failed\n");
|
|
return 1;
|
|
}
|
|
strcpy(mem, "/tmp/test");
|
|
munmap(mem, 4096);
|
|
|
|
fd = open(mem, O_RDONLY);
|
|
if (fd == -1 && errno == EFAULT) {
|
|
printf(" ✓ PASS: open returned -1 with EFAULT after munmap\n");
|
|
} else {
|
|
printf(" ✗ FAIL: open returned %d, errno=%d\n", fd, errno);
|
|
if (fd >= 0) close(fd);
|
|
}
|
|
|
|
// 测试3: stat() 使用无效路径指针
|
|
printf("\nTest 3: stat() with invalid path pointer\n");
|
|
struct stat st;
|
|
int ret = stat(bad_path, &st);
|
|
if (ret == -1 && errno == EFAULT) {
|
|
printf(" ✓ PASS: stat returned -1 with EFAULT\n");
|
|
} else {
|
|
printf(" ✗ FAIL: stat returned %d, errno=%d\n", ret, errno);
|
|
}
|
|
|
|
// 测试4: access() 使用无效路径指针
|
|
printf("\nTest 4: access() with invalid path pointer\n");
|
|
ret = access(bad_path, F_OK);
|
|
if (ret == -1 && errno == EFAULT) {
|
|
printf(" ✓ PASS: access returned -1 with EFAULT\n");
|
|
} else {
|
|
printf(" ✗ FAIL: access returned %d, errno=%d\n", ret, errno);
|
|
}
|
|
|
|
// 测试5: 正常的 open 应该工作
|
|
printf("\nTest 5: normal open should work\n");
|
|
fd = open("/", O_RDONLY);
|
|
if (fd >= 0) {
|
|
printf(" ✓ PASS: normal open succeeded (fd=%d)\n", fd);
|
|
close(fd);
|
|
} else {
|
|
printf(" ✗ FAIL: normal open failed\n");
|
|
}
|
|
|
|
// 测试6: execve 使用无效的程序路径
|
|
printf("\nTest 6: execve() with invalid path pointer\n");
|
|
char *argv[] = { NULL };
|
|
char *envp[] = { NULL };
|
|
ret = execve(bad_path, argv, envp);
|
|
if (ret == -1 && errno == EFAULT) {
|
|
printf(" ✓ PASS: execve returned -1 with EFAULT\n");
|
|
} else {
|
|
printf(" ✗ FAIL: execve returned %d, errno=%d (should not reach here)\n", ret, errno);
|
|
}
|
|
|
|
printf("\n=== All tests completed ===\n");
|
|
return 0;
|
|
}
|