Add parser for hostname and hosts
This commit is contained in:
		
							parent
							
								
									15932a54b6
								
							
						
					
					
						commit
						ffdd4d95a4
					
				
							
								
								
									
										20
									
								
								src/libos/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								src/libos/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1,5 +1,7 @@ | |||||||
| # This file is automatically @generated by Cargo. | # This file is automatically @generated by Cargo. | ||||||
| # It is not intended for manual editing. | # It is not intended for manual editing. | ||||||
|  | version = 3 | ||||||
|  | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "Occlum" | name = "Occlum" | ||||||
| version = "0.27.0" | version = "0.27.0" | ||||||
| @ -22,6 +24,7 @@ dependencies = [ | |||||||
|  "rcore-fs-ramfs", |  "rcore-fs-ramfs", | ||||||
|  "rcore-fs-sefs", |  "rcore-fs-sefs", | ||||||
|  "rcore-fs-unionfs", |  "rcore-fs-unionfs", | ||||||
|  |  "regex", | ||||||
|  "resolv-conf", |  "resolv-conf", | ||||||
|  "ringbuf", |  "ringbuf", | ||||||
|  "scroll", |  "scroll", | ||||||
| @ -518,6 +521,23 @@ dependencies = [ | |||||||
|  "rand_core 0.3.1", |  "rand_core 0.3.1", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "regex" | ||||||
|  | version = "1.3.1" | ||||||
|  | source = "git+https://github.com/mesalock-linux/regex-sgx#76aef86f9836532d17764523d0fa23bb7d2e31cf" | ||||||
|  | dependencies = [ | ||||||
|  |  "regex-syntax", | ||||||
|  |  "sgx_tstd", | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "regex-syntax" | ||||||
|  | version = "0.6.12" | ||||||
|  | source = "git+https://github.com/mesalock-linux/regex-sgx#76aef86f9836532d17764523d0fa23bb7d2e31cf" | ||||||
|  | dependencies = [ | ||||||
|  |  "sgx_tstd", | ||||||
|  | ] | ||||||
|  | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "resolv-conf" | name = "resolv-conf" | ||||||
| version = "0.7.0" | version = "0.7.0" | ||||||
|  | |||||||
| @ -29,6 +29,7 @@ memoffset = "0.6.1" | |||||||
| scroll = { version = "0.10.2", default-features = false } | scroll = { version = "0.10.2", default-features = false } | ||||||
| itertools = { version = "0.10.0", default-features = false, features = ["use_alloc"]  } | itertools = { version = "0.10.0", default-features = false, features = ["use_alloc"]  } | ||||||
| ctor = "0.1" | ctor = "0.1" | ||||||
|  | regex = { git = "https://github.com/mesalock-linux/regex-sgx", default-features = false, features = ["std", "unicode", "mesalock_sgx"] } | ||||||
| 
 | 
 | ||||||
| [patch.'https://github.com/apache/teaclave-sgx-sdk.git'] | [patch.'https://github.com/apache/teaclave-sgx-sdk.git'] | ||||||
| sgx_tstd = { path = "../../deps/rust-sgx-sdk/sgx_tstd" } | sgx_tstd = { path = "../../deps/rust-sgx-sdk/sgx_tstd" } | ||||||
|  | |||||||
| @ -29,11 +29,11 @@ typedef struct itimerspec{ | |||||||
|     struct _timespec it_value; |     struct _timespec it_value; | ||||||
| } itimerspec_t; | } itimerspec_t; | ||||||
| 
 | 
 | ||||||
| // todo: more detailed description
 | // The host_file_buffer struct includes /etc/resolv.conf, /etc/hosts and /etc/hostname buffer
 | ||||||
| struct host_file_buffer { | struct host_file_buffer { | ||||||
|     const char* resolv_conf_ptr; |     const char* resolv_conf_buf; | ||||||
|     const char* hosts_ptr; |     const char* hosts_buf; | ||||||
|     const char* hostname_ptr; |     const char* hostname_buf; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define FD_SETSIZE 1024 | #define FD_SETSIZE 1024 | ||||||
|  | |||||||
| @ -98,7 +98,7 @@ pub extern "C" fn occlum_ecall_init( | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     // Parse host file
 |     // Parse host file
 | ||||||
|     let resolv_conf_ptr = unsafe { (*file_buffer).resolv_conf_ptr }; |     let resolv_conf_ptr = unsafe { (*file_buffer).resolv_conf_buf }; | ||||||
|     match parse_host_file(HostFile::RESOLV_CONF, resolv_conf_ptr) { |     match parse_host_file(HostFile::RESOLV_CONF, resolv_conf_ptr) { | ||||||
|         Err(e) => { |         Err(e) => { | ||||||
|             error!("failed to parse /etc/resolv.conf: {}", e.backtrace()); |             error!("failed to parse /etc/resolv.conf: {}", e.backtrace()); | ||||||
| @ -111,12 +111,13 @@ pub extern "C" fn occlum_ecall_init( | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let hostname_ptr = unsafe { (*file_buffer).hostname_ptr }; |     let hostname_ptr = unsafe { (*file_buffer).hostname_buf }; | ||||||
|     match parse_host_file(HostFile::HOSTNAME, hostname_ptr) { |     match parse_host_file(HostFile::HOSTNAME, hostname_ptr) { | ||||||
|         Err(e) => { |         Err(e) => { | ||||||
|             error!("failed to parse /etc/hostname: {}", e.backtrace()); |             error!("failed to parse /etc/hostname: {}", e.backtrace()); | ||||||
|         } |         } | ||||||
|         Ok(hostname_str) => { |         Ok(hostname_str) => { | ||||||
|  |             misc::init_nodename(&hostname_str); | ||||||
|             *HOSTNAME_STR.write().unwrap() = Some(hostname_str); |             *HOSTNAME_STR.write().unwrap() = Some(hostname_str); | ||||||
|             if let Err(e) = write_host_file(HostFile::HOSTNAME) { |             if let Err(e) = write_host_file(HostFile::HOSTNAME) { | ||||||
|                 error!("failed to write /etc/hostname: {}", e.backtrace()); |                 error!("failed to write /etc/hostname: {}", e.backtrace()); | ||||||
| @ -124,7 +125,7 @@ pub extern "C" fn occlum_ecall_init( | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let hosts_ptr = unsafe { (*file_buffer).hosts_ptr }; |     let hosts_ptr = unsafe { (*file_buffer).hosts_buf }; | ||||||
|     match parse_host_file(HostFile::HOSTS, hosts_ptr) { |     match parse_host_file(HostFile::HOSTS, hosts_ptr) { | ||||||
|         Err(e) => { |         Err(e) => { | ||||||
|             error!("failed to parse /etc/hosts: {}", e.backtrace()); |             error!("failed to parse /etc/hosts: {}", e.backtrace()); | ||||||
|  | |||||||
| @ -10,4 +10,4 @@ mod uname; | |||||||
| pub use self::random::{do_getrandom, get_random, RandFlags}; | pub use self::random::{do_getrandom, get_random, RandFlags}; | ||||||
| pub use self::rlimit::{do_prlimit, resource_t, rlimit_t, ResourceLimits}; | pub use self::rlimit::{do_prlimit, resource_t, rlimit_t, ResourceLimits}; | ||||||
| pub use self::sysinfo::{do_sysinfo, sysinfo_t}; | pub use self::sysinfo::{do_sysinfo, sysinfo_t}; | ||||||
| pub use self::uname::{do_uname, utsname_t}; | pub use self::uname::{do_uname, init_nodename, utsname_t}; | ||||||
|  | |||||||
| @ -1,7 +1,5 @@ | |||||||
| use super::*; | use super::*; | ||||||
| use crate::fs::{AccessMode, CreationFlags, FileMode, FsView}; |  | ||||||
| use std::ffi::{CStr, CString}; | use std::ffi::{CStr, CString}; | ||||||
| use std::str; |  | ||||||
| /// A sample of `struct utsname`
 | /// A sample of `struct utsname`
 | ||||||
| /// ```
 | /// ```
 | ||||||
| ///   sysname = Linux
 | ///   sysname = Linux
 | ||||||
| @ -26,7 +24,7 @@ pub struct utsname_t { | |||||||
| 
 | 
 | ||||||
| pub fn do_uname(name: &mut utsname_t) -> Result<()> { | pub fn do_uname(name: &mut utsname_t) -> Result<()> { | ||||||
|     copy_from_cstr_to_u8_array(&SYSNAME, &mut name.sysname); |     copy_from_cstr_to_u8_array(&SYSNAME, &mut name.sysname); | ||||||
|     obtain_nodename(&mut name.nodename); |     copy_from_cstr_to_u8_array(&NODENAME.read().unwrap(), &mut name.nodename); | ||||||
|     copy_from_cstr_to_u8_array(&RELEASE, &mut name.release); |     copy_from_cstr_to_u8_array(&RELEASE, &mut name.release); | ||||||
|     copy_from_cstr_to_u8_array(&VERSION, &mut name.version); |     copy_from_cstr_to_u8_array(&VERSION, &mut name.version); | ||||||
|     copy_from_cstr_to_u8_array(&MACHINE, &mut name.machine); |     copy_from_cstr_to_u8_array(&MACHINE, &mut name.machine); | ||||||
| @ -36,7 +34,7 @@ pub fn do_uname(name: &mut utsname_t) -> Result<()> { | |||||||
| 
 | 
 | ||||||
| lazy_static! { | lazy_static! { | ||||||
|     static ref SYSNAME: CString = CString::new("Occlum").unwrap(); |     static ref SYSNAME: CString = CString::new("Occlum").unwrap(); | ||||||
|     static ref NODENAME: CString = CString::new("occlum-node").unwrap(); |     static ref NODENAME: RwLock<CString> = RwLock::new(CString::new("occlum-node").unwrap()); | ||||||
|     static ref RELEASE: CString = CString::new("0.1").unwrap(); |     static ref RELEASE: CString = CString::new("0.1").unwrap(); | ||||||
|     static ref VERSION: CString = CString::new("0.1").unwrap(); |     static ref VERSION: CString = CString::new("0.1").unwrap(); | ||||||
|     static ref MACHINE: CString = CString::new("x86-64").unwrap(); |     static ref MACHINE: CString = CString::new("x86-64").unwrap(); | ||||||
| @ -50,31 +48,8 @@ fn copy_from_cstr_to_u8_array(src: &CStr, dst: &mut [u8]) { | |||||||
|     dst[len] = 0; |     dst[len] = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn obtain_nodename(dst: &mut [u8]) { | pub fn init_nodename(nodename_str: &str) { | ||||||
|     const HOSTNAME_PATH: &'static str = "/etc/hostname"; |     let nodename_cstr = CString::new(nodename_str).unwrap(); | ||||||
| 
 |     let mut nodename = NODENAME.write().unwrap(); | ||||||
|     let fs_view = FsView::new(); |     *nodename = nodename_cstr; | ||||||
| 
 |  | ||||||
|     let hostname_file = match fs_view.open_file( |  | ||||||
|         HOSTNAME_PATH, |  | ||||||
|         AccessMode::O_RDONLY as u32, |  | ||||||
|         FileMode::from_bits(0o666).unwrap(), |  | ||||||
|     ) { |  | ||||||
|         Ok(file) => file, |  | ||||||
|         Err(e) => { |  | ||||||
|             // If failed to open hostname file, use "occlum-node" nodename.
 |  | ||||||
|             error!("failed to open /etc/hostname: {}", e.backtrace()); |  | ||||||
|             copy_from_cstr_to_u8_array(&NODENAME, dst); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     let mut nodename: [u8; 65] = [0; 65]; |  | ||||||
|     hostname_file.read(&mut nodename); |  | ||||||
| 
 |  | ||||||
|     // The \n need to be eliminated.
 |  | ||||||
|     let nodename_string = str::from_utf8(&nodename).unwrap().replace("\n", ""); |  | ||||||
|     let len = nodename_string.len(); |  | ||||||
|     dst[..len].copy_from_slice(&nodename_string.into_bytes()); |  | ||||||
|     dst[len] = 0; |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,9 +6,9 @@ use std::str; | |||||||
| 
 | 
 | ||||||
| #[repr(C)] | #[repr(C)] | ||||||
| pub struct host_file_buffer { | pub struct host_file_buffer { | ||||||
|     pub resolv_conf_ptr: *const c_char, |     pub resolv_conf_buf: *const c_char, | ||||||
|     pub hosts_ptr: *const c_char, |     pub hosts_buf: *const c_char, | ||||||
|     pub hostname_ptr: *const c_char, |     pub hostname_buf: *const c_char, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub enum HostFile { | pub enum HostFile { | ||||||
| @ -57,15 +57,22 @@ pub fn parse_host_file(host_file: HostFile, host_file_ptr: *const c_char) -> Res | |||||||
|     let host_file_str = str::from_utf8(host_file_bytes) |     let host_file_str = str::from_utf8(host_file_bytes) | ||||||
|         .map_err(|_| errno!(EINVAL, "host file contains non UTF-8 characters"))?; |         .map_err(|_| errno!(EINVAL, "host file contains non UTF-8 characters"))?; | ||||||
| 
 | 
 | ||||||
|  |     // Parse and inspect host file
 | ||||||
|     match host_file { |     match host_file { | ||||||
|         HostFile::HOSTS => { |         HostFile::HOSTS => { | ||||||
|             // TODO: Parsing hosts
 |             if let Err(_) = hosts_parser_util::parse_hosts_buffer(host_file_bytes) { | ||||||
|         } |                 return_errno!(EINVAL, "malformated host /etc/hosts"); | ||||||
|         HostFile::HOSTNAME => { |             } | ||||||
|             // TODO: Parsing hostname
 |  | ||||||
|         } |         } | ||||||
|  |         HostFile::HOSTNAME => match hosts_parser_util::parse_hostname_buffer(host_file_bytes) { | ||||||
|  |             Err(_) => { | ||||||
|  |                 return_errno!(EINVAL, "malformated host /etc/hostname"); | ||||||
|  |             } | ||||||
|  |             Ok(hostname_str) => { | ||||||
|  |                 return Ok(hostname_str); | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         HostFile::RESOLV_CONF => { |         HostFile::RESOLV_CONF => { | ||||||
|             // Parse and inspect host file
 |  | ||||||
|             if let Err(_) = resolv_conf::Config::parse(host_file_bytes) { |             if let Err(_) = resolv_conf::Config::parse(host_file_bytes) { | ||||||
|                 return_errno!(EINVAL, "malformated host /etc/resolv.conf"); |                 return_errno!(EINVAL, "malformated host /etc/resolv.conf"); | ||||||
|             } |             } | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								src/libos/src/util/hosts_parser_util.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										103
									
								
								src/libos/src/util/hosts_parser_util.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | use super::*; | ||||||
|  | use regex::Regex; | ||||||
|  | use std::net::IpAddr; | ||||||
|  | use std::path::Path; | ||||||
|  | use std::str; | ||||||
|  | use std::str::FromStr; | ||||||
|  | 
 | ||||||
|  | lazy_static! { | ||||||
|  |     // The hostname regex is compliant with RFC1123
 | ||||||
|  |     static ref HOSTNAME_RE: Regex = Regex::new(r"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$").unwrap(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Default, Clone)] | ||||||
|  | pub struct HostEntry { | ||||||
|  |     ip: String, | ||||||
|  |     hostname: Vec<String>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Default, Clone)] | ||||||
|  | pub struct Hosts { | ||||||
|  |     pub entries: Vec<HostEntry>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl FromStr for HostEntry { | ||||||
|  |     type Err = error::Error; | ||||||
|  |     fn from_str(line: &str) -> Result<Self> { | ||||||
|  |         let slice: Vec<String> = line.split_whitespace().map(|s| s.to_string()).collect(); | ||||||
|  | 
 | ||||||
|  |         // check IP:
 | ||||||
|  |         let ip = match slice.first() { | ||||||
|  |             Some(ip) => ip, | ||||||
|  |             None => { | ||||||
|  |                 return_errno!(EINVAL, "malformated ip in hosts file"); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let _ip_addr: IpAddr = match ip.parse() { | ||||||
|  |             Ok(ip) => ip, | ||||||
|  |             Err(_) => { | ||||||
|  |                 return_errno!(EINVAL, "malformated ip in hosts file"); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let mut hostname: Vec<String> = Vec::new(); | ||||||
|  |         for i in slice[1..].to_vec() { | ||||||
|  |             if !HOSTNAME_RE.is_match(&i) { | ||||||
|  |                 return_errno!(EINVAL, "malformated hostname in hosts file"); | ||||||
|  |             } | ||||||
|  |             hostname.push(i.to_owned()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if hostname.is_empty() { | ||||||
|  |             return_errno!(EINVAL, "malformated hostname in hosts file"); | ||||||
|  |         } | ||||||
|  |         Ok(HostEntry { | ||||||
|  |             ip: ip.to_string(), | ||||||
|  |             hostname, | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn parse_hosts_buffer(bytes: &[u8]) -> Result<Hosts> { | ||||||
|  |     let mut hosts: Hosts = Default::default(); | ||||||
|  |     for (_, line) in bytes.split(|&x| x == b'\n').enumerate() { | ||||||
|  |         let line = str::from_utf8(line).unwrap(); | ||||||
|  |         let line = line.trim_start(); | ||||||
|  |         match line.chars().next() { | ||||||
|  |             // comment
 | ||||||
|  |             Some('#') => continue, | ||||||
|  |             // empty line
 | ||||||
|  |             None => continue, | ||||||
|  |             // valid line
 | ||||||
|  |             Some(_) => {} | ||||||
|  |         } | ||||||
|  |         hosts.entries.push(line.parse()?); | ||||||
|  |     } | ||||||
|  |     Ok(hosts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn parse_hostname_buffer(bytes: &[u8]) -> Result<String> { | ||||||
|  |     let mut hostname: Vec<String> = Vec::new(); | ||||||
|  |     for (_, line) in bytes.split(|&x| x == b'\n').enumerate() { | ||||||
|  |         let line = str::from_utf8(line).unwrap(); | ||||||
|  |         let line = line.trim_start(); | ||||||
|  |         match line.chars().next() { | ||||||
|  |             // comment
 | ||||||
|  |             Some('#') => continue, | ||||||
|  |             // empty line
 | ||||||
|  |             None => continue, | ||||||
|  |             // valid line
 | ||||||
|  |             Some(_) => {} | ||||||
|  |         } | ||||||
|  |         if (!HOSTNAME_RE.is_match(&line)) | (line.len() > 64) { | ||||||
|  |             return_errno!(EINVAL, "malformated hostname in /etc/hostname file"); | ||||||
|  |         } | ||||||
|  |         hostname.push(line.to_owned()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if hostname.len() != 1 { | ||||||
|  |         return_errno!(EINVAL, "malformated hostname in /etc/hostname file"); | ||||||
|  |     } | ||||||
|  |     Ok(hostname[0].clone()) | ||||||
|  | } | ||||||
| @ -2,6 +2,7 @@ use super::*; | |||||||
| 
 | 
 | ||||||
| pub mod dirty; | pub mod dirty; | ||||||
| pub mod host_file_util; | pub mod host_file_util; | ||||||
|  | pub mod hosts_parser_util; | ||||||
| pub mod log; | pub mod log; | ||||||
| pub mod mem_util; | pub mod mem_util; | ||||||
| pub mod mpx_util; | pub mod mpx_util; | ||||||
|  | |||||||
| @ -93,11 +93,10 @@ struct occlum_pal_create_process_args { | |||||||
|     int *pid; |     int *pid; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // todo: more detailed description
 |  | ||||||
| struct host_file_buffer { | struct host_file_buffer { | ||||||
|     const char *resolv_conf_ptr; |     const char *resolv_conf_buf; | ||||||
|     const char *hosts_ptr; |     const char *hosts_buf; | ||||||
|     const char *hostname_ptr; |     const char *hostname_buf; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -165,6 +164,8 @@ int occlum_pal_kill(int pid, int sig); | |||||||
|  */ |  */ | ||||||
| int occlum_pal_destroy(void); | int occlum_pal_destroy(void); | ||||||
| 
 | 
 | ||||||
|  | void free_host_file_buffer(struct host_file_buffer file_buffer); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -108,9 +108,9 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) { | |||||||
| 
 | 
 | ||||||
|     int ecall_ret = 0; |     int ecall_ret = 0; | ||||||
|     struct host_file_buffer file_buffer = { |     struct host_file_buffer file_buffer = { | ||||||
|         .hostname_ptr = pal_load_file("/etc/hostname"), |         .hostname_buf = pal_load_file_to_string("/etc/hostname"), | ||||||
|         .hosts_ptr = pal_load_file("/etc/hosts"), |         .hosts_buf = pal_load_file_to_string("/etc/hosts"), | ||||||
|         .resolv_conf_ptr = pal_load_file("/etc/resolv.conf"), |         .resolv_conf_buf = pal_load_file_to_string("/etc/resolv.conf"), | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     const struct host_file_buffer *file_buffer_ptr = &file_buffer; |     const struct host_file_buffer *file_buffer_ptr = &file_buffer; | ||||||
| @ -118,12 +118,7 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) { | |||||||
|     sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level, |     sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level, | ||||||
|                                 resolved_path, file_buffer_ptr); |                                 resolved_path, file_buffer_ptr); | ||||||
| 
 | 
 | ||||||
|     free((void *)file_buffer.hostname_ptr); |     free_host_file_buffer(file_buffer); | ||||||
|     file_buffer.hostname_ptr = NULL; |  | ||||||
|     free((void *)file_buffer.hosts_ptr); |  | ||||||
|     file_buffer.hosts_ptr = NULL; |  | ||||||
|     free((void *)file_buffer.resolv_conf_ptr); |  | ||||||
|     file_buffer.resolv_conf_ptr = NULL; |  | ||||||
| 
 | 
 | ||||||
|     if (ecall_status != SGX_SUCCESS) { |     if (ecall_status != SGX_SUCCESS) { | ||||||
|         const char *sgx_err = pal_get_sgx_error_msg(ecall_status); |         const char *sgx_err = pal_get_sgx_error_msg(ecall_status); | ||||||
| @ -285,6 +280,17 @@ int occlum_pal_destroy(void) { | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void free_host_file_buffer(struct host_file_buffer file_buffer) { | ||||||
|  |     free((void *)file_buffer.hostname_buf); | ||||||
|  |     file_buffer.hostname_buf = NULL; | ||||||
|  | 
 | ||||||
|  |     free((void *)file_buffer.hosts_buf); | ||||||
|  |     file_buffer.hosts_buf = NULL; | ||||||
|  | 
 | ||||||
|  |     free((void *)file_buffer.resolv_conf_buf); | ||||||
|  |     file_buffer.resolv_conf_buf = NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int pal_get_version(void) __attribute__((weak, alias ("occlum_pal_get_version"))); | int pal_get_version(void) __attribute__((weak, alias ("occlum_pal_get_version"))); | ||||||
| 
 | 
 | ||||||
| int pal_init(const struct occlum_pal_attr *attr)\ | int pal_init(const struct occlum_pal_attr *attr)\ | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "pal_log.h" | #include "pal_log.h" | ||||||
| 
 | 
 | ||||||
| char *pal_load_file(const char *filename) { | char *pal_load_file_to_string(const char *filename) { | ||||||
|     FILE *fp = fopen(filename, "rb"); |     FILE *fp = fopen(filename, "rb"); | ||||||
| 
 | 
 | ||||||
|     if (fp == NULL) { |     if (fp == NULL) { | ||||||
| @ -18,7 +18,7 @@ char *pal_load_file(const char *filename) { | |||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     fread(file_buffer, 1, fsize, fp); |     fread(file_buffer, 1, fsize, fp); | ||||||
|     file_buffer[fsize] = 0; |     file_buffer[fsize] = '\0'; | ||||||
|     fclose(fp); |     fclose(fp); | ||||||
|     return file_buffer; |     return file_buffer; | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #ifndef __PAL_LOAD_FILE_H__ | #ifndef __PAL_LOAD_FILE_H__ | ||||||
| #define __PAL_LOAD_FILE_H__ | #define __PAL_LOAD_FILE_H__ | ||||||
| 
 | 
 | ||||||
| char *pal_load_file(const char *filename); | char *pal_load_file_to_string(const char *filename); | ||||||
| 
 | 
 | ||||||
| #endif /* __PAL_LOAD_FILE_H__ */ | #endif /* __PAL_LOAD_FILE_H__ */ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user