Я пытаюсь прочитать содержимое файла из анклава с помощью 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 (ноль)
Я не уверен, что я делаю не так?
В приведенной выше программе доверенная функция read_IMA_file вызывается с переменной-указателем (указатель OUT) типа символ. Здесь мы передаем переменную-указатель без выделения памяти.
«read_IMA_file» инициирует OCall, который выделяет память и выполняет операцию «Копировать». Теперь выделенная память действительна в недоверенной области. Таким образом, мы получаем ожидаемый результат для<
Поскольку нет доверенной памяти, выделенной для «содержимого» (до вызова Ocall), во время возврата Ocall в указателе «OUT» не происходит операция обратного копирования.
Таким образом, «buf» не содержит никаких действительных данных при выполнении «print (buf)» после того, как Ocall вернется в доверенную область.
Пожалуйста, попробуйте с действительным указателем OUT на символьный буфер (с некоторым выделением памяти) или указателем IN и OUT на строковый буфер.
Если вы ожидаете, что он выведет 1234567890, то вам может понадобиться malloc (11) вместо malloc (10), плюс способ, которым вы используете копию, может также содержать ошибку.
копия (&TMP [0], &tmp [9], content);
копирует 123456789 в контент, исключая последний итератор &ТМП [9], как я понимаю. Для более подробной информации, вы можете посмотреть на: http://www.cplusplus.com/reference/algorithm/copy/
Кроме того, я думаю, что вы также не читаете ни одного контента из файла «test.txt».