@@ -245,6 +245,65 @@ TEST_F(enclave, unclobbered_vdso)
EXPECT_EQ(self->run.user_data, 0);
}
+static bool sysfs_get_ulong(const char *path, unsigned long *value)
+{
+ struct stat sbuf;
+ char buf[128];
+ ssize_t ret;
+ int fd;
+
+ ret = stat(path, &sbuf);
+ if (ret)
+ return false;
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ return false;
+
+ ret = read(fd, buf, sizeof(buf));
+ if (ret < 0) {
+ close(fd);
+ return false;
+ }
+
+ errno = 0;
+ *value = strtoul(buf, NULL, 0);
+
+ close(fd);
+
+ return errno ? false : true;
+}
+
+TEST_F(enclave, unclobbered_vdso_oversubscribed)
+{
+ unsigned long total_mem;
+ struct encl_op op;
+
+ ASSERT_TRUE(sysfs_get_ulong(SGX_TOTAL_MEM_PATH, &total_mem));
+ ASSERT_TRUE(setup_test_encl(total_mem, &self->encl, _metadata));
+
+ memset(&self->run, 0, sizeof(self->run));
+ self->run.tcs = self->encl.encl_base;
+
+ op.type = ENCL_OP_PUT;
+ op.buffer = MAGIC;
+
+ EXPECT_EQ(ENCL_CALL(&op, &self->run, false), 0);
+
+ EXPECT_EEXIT(&self->run);
+ EXPECT_EQ(self->run.user_data, 0);
+
+ op.type = ENCL_OP_GET;
+ op.buffer = 0;
+
+ EXPECT_EQ(ENCL_CALL(&op, &self->run, false), 0);
+
+ EXPECT_EQ(op.buffer, MAGIC);
+ EXPECT_EEXIT(&self->run);
+ EXPECT_EQ(self->run.user_data, 0);
+
+}
+
TEST_F(enclave, clobbered_vdso)
{
struct encl_op op;
@@ -7,6 +7,7 @@
#define MAIN_H
#define ENCL_HEAP_SIZE_DEFAULT 4096
+#define SGX_TOTAL_MEM_PATH "/sys/kernel/debug/x86/sgx_total_mem"
struct encl_segment {
void *src;