我正在尝试使用以下原型执行一项功能:
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
?如果是,我如何从size
中的[out]
参数中引用它?
或许还有另一种方法可以做这种行为?初始化一个可变大小的缓冲区并将其传递给外部?非常感谢。
答案 0 :(得分:0)
据我所知,不可能做你想做的事。看起来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);
}
我不确定这是最优的,但这是我最终使用的解决方案。