使用 OCALL,我想将不受信任的内存中动态创建的 C 字符串的副本获取到我的飞地中。因此,我必须使用[out, string]
属性。
但是,我不能这样做,因为我还必须添加[in]
属性。问题是我真的不知道字符串的大小,我不希望每次制作 OCALL 时从 enclave 到不受信任的内存中不必要的字符串复制开销(随[in]
一起(。
我的 edl 文件:
enclave {
trusted {
public void ecall_open(void);
};
untrusted {
void ocall_get_string([out, string] char* str);
};
};
error: string/wstring/sizefunc should be used with an 'in' attribute
为什么必须添加[in]
属性?
有没有办法避免这种开销?
我想,一种解决方案是将一个指向char*
的指针传递[out]
属性和长度:
void ocall_get_string([out] char** str, [out] size_t* length);
然后使用memcpy()
手动将 C 字符串从不受信任的内存复制到受信任的内存。
飞地内部:
char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL
size_t length; // length of string
ocall_get_string(&untrusted_str, &length);
char *trusted_str = new char[length]; // pointer to string in trusted memory
memcpy(trusted_str, untrusted_str, length);
// delete it later
delete[] trusted_str;
也许你应该试试这个:
void ocall_get_string([out, size=sz] char* str, size_t sz);
size=sz
表示将自动复制回 Enclave 的str
的大小。如果未指定大小,则只会将一个字符复制回安全区。