0

我正在尝试使用 OCalls 从飞地中读取文件的内容。

飞地.edl:

untrusted {
        void ocall_print_string([in, string] const char *str);
        void ocall_read_IMA_file([in, string] const char *filename, [out] char *buf, [out] int *size);
};

飞地.cpp:

void printf(const char *fmt, ...) {
    ocall_print_string(fmt);
}

void read_IMA_file(const char *filename, char *buf, int *size) {
    ocall_read_IMA_file(filename, buf, size);

    printf(buf);
}

//whereas the read_IMA_file function is called with
char *buf;
int size;
read_IMA_file("test.txt", buf, &size);

应用程序中ocall函数的实现:

void ocall_print_string(const char *str) {
    printf("%s\n", str);
}

void ocall_read_IMA_file(const char *filename, char *content, int *size) {
    content = (char*) malloc(sizeof(char) * 10);
    memset(content, '\0', sizeof(char) *10);
    char tmp[] = "1234567890";
    copy(&tmp[0], &tmp[9], content);

    cout << content << endl;
}

但我收到的结果如下:

123456789(空)

我不确定我做错了什么?

4

2 回答 2

1

在上面的程序中,“read_IMA_file”可信函数是用字符类型的指针变量(OUT指针)调用的。这里我们传递指针变量,没有任何内存分配。“read_IMA_file”启动一个OCall,分配内存并进行“复制”操作。现在分配的内存在不受信任的区域内是有效的。所以我们得到了“cout<

由于没有为“内容”分配受信任的内存(在调用 Ocall 之前),因此在 Ocall 返回期间不会在“OUT”指针中发生复制回操作。因此,在 Ocall 在可信区域返回后执行“print(buf)”时,“buf”不包含任何有效数据。

请尝试使用指向字符缓冲区的有效 OUT 指针(具有一些内存分配)或指向字符串缓冲区的 IN 和 OUT 指针。

于 2017-01-24T09:06:39.640 回答
1

如果您希望它输出 1234567890,那么您可能需要 malloc(11) 而不是 malloc(10),而且您使用复制的方式也可能包含错误。

复制(&tmp[0],&tmp[9],内容);正在将 123456789 复制到内容中,据我了解,它排除了最后一个迭代器 &tmp[9] 。有关更多详细信息,您可能需要查看:http ://www.cplusplus.com/reference/algorithm/copy/

另外,我认为您也没有从文件“test.txt”中读取任何内容。

于 2017-01-09T06:25:27.503 回答