blob: 27998eec5537b30b3ce32edaf5280283d52049ab [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <dirent.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <zxtest/zxtest.h>
#define GOOD_SYMBOL "zx_syscall_test_0"
#define BAD_SYMBOL "zx_syscall_test_1"
TEST(VdsoVariantTests, vdso_open_test) {
int vdso_dir_fd = open("/boot/kernel/vdso", O_RDONLY | O_DIRECTORY);
ASSERT_GE(vdso_dir_fd, 0, "open of vdso directory failed");
DIR* dir = fdopendir(dup(vdso_dir_fd));
ASSERT_NOT_NULL(dir, "fdopendir failed");
const struct dirent* d;
int vdso_files_found = 0;
while ((d = readdir(dir)) != NULL) {
if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
continue;
++vdso_files_found;
// Test that we can open for read.
int fd = openat(vdso_dir_fd, d->d_name, O_RDONLY);
EXPECT_GE(fd, 0, "%s", d->d_name);
EXPECT_EQ(close(fd), 0, "");
// Test that we cannot open for write.
EXPECT_EQ(openat(vdso_dir_fd, d->d_name, O_RDWR), -1, "opening vDSO file for writing");
EXPECT_EQ(errno, EACCES, "opening vDSO file for writing");
}
EXPECT_GT(vdso_files_found, 1, "didn't find vDSO files");
EXPECT_EQ(closedir(dir), 0, "");
EXPECT_EQ(close(vdso_dir_fd), 0, "");
}
TEST(VdsoVariantTests, vdso_missing_test_syscall1_test) {
void* dso = dlopen("libzircon.so", RTLD_LOCAL | RTLD_NOLOAD);
ASSERT_NOT_NULL(dso, "%s", dlerror());
EXPECT_NOT_NULL(dlsym(dso, GOOD_SYMBOL), "%s", dlerror());
EXPECT_NULL(dlsym(dso, BAD_SYMBOL), BAD_SYMBOL " symbol found in vDSO");
EXPECT_EQ(dlclose(dso), 0, "");
}