我正在尝试使用OCalls从安全区读取文件的内容。
enclave.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);
};
enclave.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(null)
我不确定我做错了什么?
答案 0 :(得分:1)
如果您希望它输出1234567890,那么您可能需要malloc(11)而不是malloc(10), plus 您使用副本的方式也可能包含错误。
copy(&amp; tmp [0],&amp; tmp [9],content); 正在复制123456789到内容,它排除了我理解的最后一个迭代器&amp; tmp [9]。有关更多详细信息,您可能需要查看:http://www.cplusplus.com/reference/algorithm/copy/
此外,我认为您没有阅读文件中的任何内容&#34; test.txt&#34;任
答案 1 :(得分:1)
在上面的程序中,使用类型为character的指针变量(OUT指针)调用“read_IMA_file”可信函数。这里我们传递指针变量而没有任何内存分配。 “read_IMA_file”启动OCall,分配内存并执行“复制”操作。现在,分配的内存在不受信任的区域内有效。所以我们得到了“cout&lt;”的预期结果。
由于没有为“内容”分配可信内存(在调用Ocall之前),因此在Ocall返回期间“OUT”指针中不会发生复制操作。 因此,在Ocall在受信任区域返回后执行“print(buf)”时,“buf”不包含任何有效数据。
请尝试使用有效的OUT指针指向字符缓冲区(带有一些内存分配)或IN和OUT指针指向字符串缓冲区。