Deep copy host file
This commit is contained in:
parent
ff48b7d807
commit
036eb08193
@ -32,6 +32,15 @@ enclave {
|
||||
uint32_t qe_identity_size;
|
||||
};
|
||||
|
||||
struct host_file_buffer {
|
||||
[size=resolv_conf_buf_size]char *resolv_conf_buf;
|
||||
uint32_t resolv_conf_buf_size;
|
||||
[size=hosts_buf_size]char *hosts_buf;
|
||||
uint32_t hosts_buf_size;
|
||||
[size=hostname_buf_size]char *hostname_buf;
|
||||
uint32_t hostname_buf_size;
|
||||
};
|
||||
|
||||
trusted {
|
||||
/*
|
||||
* Initialize the LibOS according to the specified attributes.
|
||||
@ -43,7 +52,10 @@ enclave {
|
||||
* EINVAL - The value of an argument are invalid.
|
||||
*/
|
||||
|
||||
public int occlum_ecall_init([in, string] const char* log_level, [in, string] const char* instance_dir, [in] const struct host_file_buffer* file_buffer);
|
||||
public int occlum_ecall_init(
|
||||
[in, string] const char* log_level,
|
||||
[in, string] const char* instance_dir,
|
||||
[in] const struct host_file_buffer* file_buffer);
|
||||
|
||||
/*
|
||||
* Create a new LibOS process to do the task specified by the given
|
||||
|
@ -29,13 +29,6 @@ typedef struct itimerspec{
|
||||
struct _timespec it_value;
|
||||
} itimerspec_t;
|
||||
|
||||
// The host_file_buffer struct includes /etc/resolv.conf, /etc/hosts and /etc/hostname buffer
|
||||
struct host_file_buffer {
|
||||
const char* resolv_conf_buf;
|
||||
const char* hosts_buf;
|
||||
const char* hostname_buf;
|
||||
};
|
||||
|
||||
#define FD_SETSIZE 1024
|
||||
typedef struct {
|
||||
unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)];
|
||||
|
@ -7,8 +7,11 @@ use std::str;
|
||||
#[repr(C)]
|
||||
pub struct host_file_buffer {
|
||||
pub resolv_conf_buf: *const c_char,
|
||||
resolv_conf_buf_size: u32,
|
||||
pub hosts_buf: *const c_char,
|
||||
hosts_buf_size: u32,
|
||||
pub hostname_buf: *const c_char,
|
||||
hostname_buf_size: u32,
|
||||
}
|
||||
|
||||
pub enum HostFile {
|
||||
|
@ -93,10 +93,13 @@ struct occlum_pal_create_process_args {
|
||||
int *pid;
|
||||
};
|
||||
|
||||
struct host_file_buffer {
|
||||
const char *resolv_conf_buf;
|
||||
const char *hosts_buf;
|
||||
const char *hostname_buf;
|
||||
struct host_file_buffer_t {
|
||||
char *resolv_conf_buf;
|
||||
unsigned int resolv_conf_buf_size;
|
||||
char *hosts_buf;
|
||||
unsigned int hosts_buf_size;
|
||||
char *hostname_buf;
|
||||
unsigned int hostname_buf_size;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -164,7 +167,7 @@ int occlum_pal_kill(int pid, int sig);
|
||||
*/
|
||||
int occlum_pal_destroy(void);
|
||||
|
||||
void free_host_file_buffer(struct host_file_buffer file_buffer);
|
||||
void free_host_file_buffer_t(struct host_file_buffer_t file_buffer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -107,18 +107,33 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) {
|
||||
eid = pal_get_enclave_id();
|
||||
|
||||
int ecall_ret = 0;
|
||||
struct host_file_buffer file_buffer = {
|
||||
.hostname_buf = pal_load_file_to_string("/etc/hostname"),
|
||||
.hosts_buf = pal_load_file_to_string("/etc/hosts"),
|
||||
.resolv_conf_buf = pal_load_file_to_string("/etc/resolv.conf"),
|
||||
|
||||
load_file_t hostname_ptr = {0, NULL};
|
||||
load_file_t hosts_ptr = {0, NULL};
|
||||
load_file_t resolv_conf_ptr = {0, NULL};
|
||||
|
||||
pal_load_file("/etc/hostname", &hostname_ptr);
|
||||
pal_load_file("/etc/hosts", &hosts_ptr);
|
||||
pal_load_file("/etc/resolv.conf", &resolv_conf_ptr);
|
||||
|
||||
struct host_file_buffer_t file_buffer = {
|
||||
.hostname_buf = hostname_ptr.buffer,
|
||||
.hostname_buf_size = hostname_ptr.size,
|
||||
.hosts_buf = hosts_ptr.buffer,
|
||||
.hosts_buf_size = hosts_ptr.size,
|
||||
.resolv_conf_buf = resolv_conf_ptr.buffer,
|
||||
.resolv_conf_buf_size = resolv_conf_ptr.size,
|
||||
};
|
||||
|
||||
const struct host_file_buffer *file_buffer_ptr = &file_buffer;
|
||||
const struct host_file_buffer_t *file_buffer_ptr = &file_buffer;
|
||||
|
||||
sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level,
|
||||
resolved_path, file_buffer_ptr);
|
||||
|
||||
free_host_file_buffer(file_buffer);
|
||||
free_host_file_buffer_t(file_buffer);
|
||||
hostname_ptr.buffer = NULL;
|
||||
hosts_ptr.buffer = NULL;
|
||||
resolv_conf_ptr.buffer = NULL;
|
||||
|
||||
if (ecall_status != SGX_SUCCESS) {
|
||||
const char *sgx_err = pal_get_sgx_error_msg(ecall_status);
|
||||
@ -280,7 +295,7 @@ int occlum_pal_destroy(void) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void free_host_file_buffer(struct host_file_buffer file_buffer) {
|
||||
void free_host_file_buffer_t(struct host_file_buffer_t file_buffer) {
|
||||
free((void *)file_buffer.hostname_buf);
|
||||
file_buffer.hostname_buf = NULL;
|
||||
|
||||
|
@ -1,24 +1,27 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "pal_log.h"
|
||||
#include "pal_load_file.h"
|
||||
|
||||
char *pal_load_file_to_string(const char *filename) {
|
||||
void pal_load_file(const char *filename, load_file_t *load_file) {
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
|
||||
if (fp == NULL) {
|
||||
PAL_WARN("Warning: Failed to open file: %s", filename);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
long fsize = ftell(fp);
|
||||
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
char *file_buffer = malloc(fsize + 1);
|
||||
if (file_buffer == NULL) {
|
||||
load_file->buffer = malloc(fsize + 1);
|
||||
if (load_file->buffer == NULL) {
|
||||
PAL_WARN("Warning: Failed to malloc buffer for file: %s", filename);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
fread(file_buffer, 1, fsize, fp);
|
||||
file_buffer[fsize] = '\0';
|
||||
fread(load_file->buffer, 1, fsize, fp);
|
||||
load_file->buffer[fsize] = '\0';
|
||||
load_file->size = fsize + 1;
|
||||
|
||||
fclose(fp);
|
||||
return file_buffer;
|
||||
}
|
||||
|
@ -1,6 +1,11 @@
|
||||
#ifndef __PAL_LOAD_FILE_H__
|
||||
#define __PAL_LOAD_FILE_H__
|
||||
|
||||
char *pal_load_file_to_string(const char *filename);
|
||||
typedef struct {
|
||||
unsigned int size;
|
||||
char *buffer;
|
||||
} load_file_t;
|
||||
|
||||
void pal_load_file(const char *filename, load_file_t *load_file);
|
||||
|
||||
#endif /* __PAL_LOAD_FILE_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user