我正在尝试使用以下原型(prototype)执行一个函数:
void pass_buffer(void** buffer_out, size_t* buffer_out_len, const void* buffer_in, size_t buffer_in_len);
因此,我们的想法是将一个缓冲区传递到飞地,然后在另一个缓冲区中返回响应,该缓冲区的大小可能有所不同,该大小存储在 buffer_out_len
中。
我在定义 EDL 函数时遇到问题。所以我的想法是做类似的事情:
public void pass_buffer([out]void** buffer_out, [out]size_t* buffer_out_len, [in, size = buffer_in_len]const void* buffer_in, size_t buffer_in_len);
现在,这只返回一个充满了一个的缓冲区。我知道我应该使用 size
参数传递缓冲区的长度,但不允许在 size
中使用指针:
public void pass_buffer([out, size = *buffer_out_len]void** buffer_out, [out]size_t* buffer_out_len, [in, size = buffer_in_len]const void* buffer_in, size_t buffer_in_len);
我的最后一个解决方案可以使用其他语法吗?或者也许通过将返回值设置为 size_t buffer_out_len
?如果是这样,我如何从 [out]
中的 size
参数引用它?
或者也许还有另一种方法可以实现这种行为?初始化一个可变大小的缓冲区并将其传递给外部?非常感谢。
最佳答案
据我所知,不可能做你想做的事。看来 ecall 函数在调用函数时需要知道带有 [out] 属性的缓冲区的大小。这也是为什么你的最后一个解决方案不起作用,大小函数或变量是在函数调用时计算的。
我看到您的问题有两种解决方案,要么使用具有预定足够大小的缓冲区,要么声明一个具有可变大小参数的 ocall 函数,然后从 ecall 函数的代码中调用它来“设置”您的返回值。这是第二个解决方案的(未经测试的)示例:
在您的 .edl 文件中:
untrusted {
public void get_buffer([in, size = buffer_in_len] void* buffer_in, size_t buffer_in_len);
};
trusted {
void set_buffer([in, size = buffer_len] void* buffer, size_t buffer_len);
};
在你的飞地:
void get_buffer(void* buffer_in, size_t buffer_in_len){
[...]
set_buffer(my_buffer, my_buffer_len);
}
我不确定这是否是最佳的,但这是我最终使用的解决方案。
关于c - 将可变大小缓冲区从 SGX enclave 传递到外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395654/