@@ -211,11 +211,13 @@ let retval_declr = { Ast.identifier = retval_name; Ast.array_dims = []; }
211211let eid_name = " eid"
212212let ms_ptr_name = " pms"
213213let ms_struct_val = " ms"
214+ let ms_in_struct_val = " __in_ms"
214215let mk_ms_member_name (pname : string ) = " ms_" ^ pname
215216let mk_ms_struct_name (fname : string ) = " ms_" ^ fname ^ " _t"
216217let ms_retval_name = mk_ms_member_name retval_name
217218let mk_tbridge_name (fname : string ) = " sgx_" ^ fname
218219let mk_parm_accessor name = sprintf " %s->%s" ms_struct_val (mk_ms_member_name name)
220+ let mk_in_parm_accessor name = sprintf " %s.%s" ms_in_struct_val (mk_ms_member_name name)
219221let mk_tmp_var name = " _tmp_" ^ name
220222let mk_tmp_var2 name1 name2 = " _tmp_" ^ name1 ^ " _" ^ name2
221223let mk_len_var name = " _len_" ^ name
@@ -242,14 +244,6 @@ extern \"C\" {\n\
242244(* Header footer *)
243245let header_footer = " \n #ifdef __cplusplus\n }\n #endif /* __cplusplus */\n\n #endif\n "
244246
245- (* NO_HARDEN_EXT_WRITES Macro *)
246- let mk_no_harden_macro = sprintf " \n #ifdef NO_HARDEN_EXT_WRITES\n %s\n #else\n %s\n #endif /* NO_HARDEN_EXT_WRITES */\n "
247-
248- (* NO_HARDEN_EXT_WRITES Macro *)
249- let memcpy_macro = mk_no_harden_macro
250- " #define MEMCPY_S memcpy_s\n #define MEMSET memset"
251- " #define MEMCPY_S memcpy_verw_s\n #define MEMSET memset_verw"
252-
253247(* Little functions for generating file names. *)
254248let get_uheader_short_name (file_shortnm : string ) = file_shortnm ^ " _u.h"
255249let get_uheader_name (file_shortnm : string ) =
@@ -738,7 +732,7 @@ let gen_theader_preemble (guard: string) (inclist: string) =
738732#include <wchar.h>\n \
739733#include <stddef.h>\n \
740734#include \" sgx_edger8r.h\" /* for sgx_ocall etc. */\n\n " in
741- grd_hdr ^ inc_exp ^ inclist ^ " \n " ^ common_macros ^ memcpy_macro
735+ grd_hdr ^ inc_exp ^ inclist ^ " \n " ^ common_macros
742736
743737(* Generate trusted header for enclave *)
744738let gen_trusted_header (ec : enclave_content ) =
@@ -761,7 +755,7 @@ let gen_trusted_header (ec: enclave_content) =
761755 close_out out_chan
762756
763757(* It generates function invocation expression. *)
764- let mk_parm_name_raw (pt : Ast.parameter_type ) (declr : Ast.declarator ) =
758+ let mk_parm_name_raw (pt : Ast.parameter_type ) (declr : Ast.declarator ) ( tbridge : bool ) =
765759 let cast_expr =
766760 let tystr = get_param_tystr pt in
767761 if Ast. is_array declr && List. length declr.Ast. array_dims > 1
@@ -770,31 +764,29 @@ let mk_parm_name_raw (pt: Ast.parameter_type) (declr: Ast.declarator) =
770764 sprintf " (%s (*)%s)" tystr dims
771765 else " "
772766 in
773- cast_expr ^ mk_parm_accessor declr.Ast. identifier
767+ cast_expr ^ ( if tbridge then mk_in_parm_accessor else mk_parm_accessor) declr.Ast. identifier
774768
775769(* We passed foreign array `foo_array_t foo' as `&foo[0]', thus we
776770 * need to get back `foo' by '* array_ptr' where
777771 * array_ptr = &foo[0]
778772*)
779773let add_foreign_array_ptrref
780- (f : Ast.parameter_type -> Ast.declarator -> string )
781- (pt : Ast.parameter_type )
782- (declr : Ast.declarator ) =
783- let arg = f pt declr in
774+ (arg : string )
775+ (pt : Ast.parameter_type ) =
784776 if is_foreign_array pt
785777 then sprintf " (%s != NULL) ? (*%s) : NULL" arg arg
786778 else arg
787779
788780let mk_parm_name_ubridge (pt : Ast.parameter_type ) (declr : Ast.declarator ) =
789- add_foreign_array_ptrref mk_parm_name_raw pt declr
781+ add_foreign_array_ptrref ( mk_parm_name_raw pt declr false ) pt
790782
791783let mk_parm_name_ext (pt : Ast.parameter_type ) (declr : Ast.declarator ) =
792784 let name = declr.Ast. identifier in
793785 match pt with
794- Ast. PTVal _ -> mk_parm_name_raw pt declr
786+ Ast. PTVal _ -> mk_parm_name_raw pt declr true
795787 | Ast. PTPtr (_ , attr ) ->
796788 match attr.Ast. pa_direction with
797- | Ast. PtrNoDirection -> mk_parm_name_raw pt declr
789+ | Ast. PtrNoDirection -> mk_parm_name_raw pt declr true
798790 | _ -> mk_in_var name
799791
800792let gen_func_invoking (fd : Ast.func_decl )
@@ -968,7 +960,7 @@ let gen_ptr_size (ty: Ast.atype) (pattr: Ast.ptr_attr) (name: string) (get_parm:
968960 else
969961 (* genrerate ms_parm_len only for ecall with string/wstring in _t.c.*)
970962 if (pattr.Ast. pa_isstr || pattr.Ast. pa_iswstr) && parm_name <> name then
971- sprintf " %s_len " (mk_parm_accessor name)
963+ sprintf " %s_len " (mk_in_parm_accessor name)
972964 else
973965 (* genrerate strlen(param)/wcslen(param) only for ocall with string/wstring in _t.c.*)
974966 if pattr.Ast. pa_isstr then
@@ -1407,7 +1399,7 @@ let gen_struct_ptr_direction_post (param_direction: Ast.ptr_direction) (struct_t
14071399 " \t\t status = SGX_ERROR_INVALID_PARAMETER;" ;
14081400 " \t\t break;" ;
14091401 " \t }" ;
1410- sprintf " \t if (MEMCPY_S (%s, %s, %s, %s)) {" in_ptr_name in_len_ptr_var in_struct_member out_len_ptr_var;
1402+ sprintf " \t if (memcpy_verw_s (%s, %s, %s, %s)) {" in_ptr_name in_len_ptr_var in_struct_member out_len_ptr_var;
14111403 sprintf " \t\t status = SGX_ERROR_UNEXPECTED;" ;
14121404 " \t\t break;" ;
14131405 " \t }" ;
@@ -1449,7 +1441,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14491441 " \t {" ;
14501442 sprintf " \t\t %s[%s - 1] = '\\ 0';" in_ptr_name len_var;
14511443 sprintf " \t\t %s = strlen(%s) + 1;" len_var in_ptr_name;
1452- sprintf " \t\t if (MEMCPY_S ((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
1444+ sprintf " \t\t if (memcpy_verw_s ((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
14531445 " \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
14541446 " \t\t\t goto err;" ;
14551447 " \t\t }" ;
@@ -1463,7 +1455,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14631455 " \t {" ;
14641456 sprintf " \t\t %s[(%s - sizeof(wchar_t))/sizeof(wchar_t)] = (wchar_t)0;" in_ptr_name len_var;
14651457 sprintf " \t\t %s = (wcslen(%s) + 1) * sizeof(wchar_t);" len_var in_ptr_name;
1466- sprintf " \t\t if (MEMCPY_S ((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
1458+ sprintf " \t\t if (memcpy_verw_s ((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
14671459 " \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
14681460 " \t\t\t goto err;" ;
14691461 " \t\t }" ;
@@ -1474,7 +1466,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14741466 else
14751467 let code_template = [
14761468 sprintf " \t if (%s) {" in_ptr_name;
1477- sprintf " %s\t\t if (MEMCPY_S (%s, %s, %s, %s)) {" struct_deep_copy_post (mk_tmp_var name) len_var in_ptr_name len_var;
1469+ sprintf " %s\t\t if (memcpy_verw_s (%s, %s, %s, %s)) {" struct_deep_copy_post (mk_tmp_var name) len_var in_ptr_name len_var;
14781470 " \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
14791471 " \t\t\t goto err;" ;
14801472 " \t\t }" ;
@@ -1547,7 +1539,7 @@ let gen_tmp_size (pattr: Ast.ptr_attr) (plist: Ast.pdecl list) =
15471539 else
15481540 let param_tystr = find_param_type s plist in
15491541 let tmp_var = mk_tmp_var s in
1550- let parm_str = mk_parm_accessor s in
1542+ let parm_str = mk_in_parm_accessor s in
15511543 Hashtbl. add param_cache s true ;
15521544 sprintf " \t %s %s = %s;\n " param_tystr tmp_var parm_str
15531545 in
@@ -1602,7 +1594,7 @@ let tbridge_mk_parm_name_ext (pt: Ast.parameter_type) (declr: Ast.declarator) =
16021594 else mk_parm_name_ext pt declr
16031595
16041596let mk_parm_name_tbridge (pt : Ast.parameter_type ) (declr : Ast.declarator ) =
1605- add_foreign_array_ptrref tbridge_mk_parm_name_ext pt declr
1597+ add_foreign_array_ptrref ( tbridge_mk_parm_name_ext pt declr) pt
16061598
16071599(* Generate local variables required for the trusted bridge. *)
16081600let gen_tbridge_local_vars (plist : Ast.pdecl list ) =
@@ -1612,7 +1604,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
16121604 let ty = Ast. get_param_atype pt in
16131605 let tmp_var =
16141606 (* Save a copy of pointer in case it might be modified in the marshaling structure. *)
1615- sprintf " \t %s%s %s = %s;\n " qual (Ast. get_tystr ty) (mk_tmp_var name) (mk_parm_accessor name)
1607+ sprintf " \t %s%s %s = %s;\n " qual (Ast. get_tystr ty) (mk_tmp_var name) (mk_in_parm_accessor name)
16161608 in
16171609 let len_var =
16181610 if not attr.Ast. pa_chkptr then " "
@@ -1637,7 +1629,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
16371629 let gen_local_var_for_foreign_array (ty : Ast.atype ) (attr : Ast.ptr_attr ) (name : string ) =
16381630 let tystr = Ast. get_tystr ty in
16391631 let tmp_var =
1640- sprintf " \t %s* %s = %s;\n " tystr (mk_tmp_var name) (mk_parm_accessor name)
1632+ sprintf " \t %s* %s = %s;\n " tystr (mk_tmp_var name) (mk_in_parm_accessor name)
16411633 in
16421634 let len_var = sprintf " \t size_t %s = sizeof(%s);\n " (mk_len_var name) tystr
16431635 in
@@ -1681,13 +1673,28 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
16811673 ms_struct_val
16821674 ms_struct_name
16831675 ms_ptr_name in
1676+ let declare_ms = sprintf " %s %s;"
1677+ ms_struct_name
1678+ ms_in_struct_val in
1679+ let copy_ms =
1680+ let code_template = [
1681+ sprintf " if (memcpy_s(&%s, sizeof(%s), %s, sizeof(%s))) {"
1682+ ms_in_struct_val
1683+ ms_struct_name
1684+ ms_struct_val
1685+ ms_struct_name;
1686+ " \t return SGX_ERROR_UNEXPECTED;" ;
1687+ " }" ;
1688+ ]
1689+ in
1690+ List. fold_left (fun acc s -> acc ^ " \t " ^ s ^ " \n " ) " " code_template in
16841691
16851692 let invoke_func = gen_func_invoking fd mk_parm_name_tbridge in
16861693
16871694 let update_retval =
16881695 let code_template = [
16891696 sprintf " %s = %s" (mk_in_var retval_name) invoke_func;
1690- sprintf " if (MEMCPY_S (&%s, sizeof(%s), &%s, sizeof(%s))) {"
1697+ sprintf " if (memcpy_verw_s (&%s, sizeof(%s), &%s, sizeof(%s))) {"
16911698 (mk_parm_accessor retval_name)
16921699 (mk_parm_accessor retval_name)
16931700 (mk_in_var retval_name)
@@ -1705,10 +1712,12 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
17051712 in
17061713 sprintf " %s%s%s\t %s\n\t %s\n %s" func_open local_vars dummy_var check_pms invoke_func func_close
17071714 else
1708- sprintf " %s%s\t %s\n %s\n %s%s\n %s%s%s\n %s\n %s%s"
1715+ sprintf " %s%s\t %s\n\t %s \n %s %s\n %s%s\n %s%s%s\n %s\n %s%s"
17091716 func_open
17101717 (mk_check_pms fd.Ast. fname)
17111718 declare_ms_ptr
1719+ declare_ms
1720+ copy_ms
17121721 local_vars
17131722 (gen_check_tbridge_length_overflow fd.Ast. plist)
17141723 (gen_check_tbridge_ptr_parms fd.Ast. plist)
@@ -1726,7 +1735,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
17261735 let parm_accessor = mk_parm_accessor name in
17271736 let sgx_ocfree_fn = get_sgx_fname SGX_OCFREE is_ocall_switchless in
17281737 let copy_ms_val_filed = [
1729- sprintf " \t if (MEMCPY_S (&%s, sizeof(%s), &%s, sizeof(%s))) {"
1738+ sprintf " \t if (memcpy_verw_s (&%s, sizeof(%s), &%s, sizeof(%s))) {"
17301739 parm_accessor
17311740 parm_accessor
17321741 name
@@ -1786,7 +1795,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
17861795 in
17871796 let post =
17881797 let code_template = [
1789- sprintf " \t if (MEMCPY_S ((void *)((size_t)__tmp + sizeof(__local_%s) * i), sizeof(__local_%s), &__local_%s, sizeof(__local_%s))) {" name name name name;
1798+ sprintf " \t if (memcpy_verw_s ((void *)((size_t)__tmp + sizeof(__local_%s) * i), sizeof(__local_%s), &__local_%s, sizeof(__local_%s))) {" name name name name;
17901799 sprintf " \t\t %s();" sgx_ocfree_fn;
17911800 " \t\t return SGX_ERROR_UNEXPECTED;" ;
17921801 " \t }" ;
@@ -1801,7 +1810,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18011810 let non_deep_copy_out =
18021811 let code_template =
18031812 [
1804- sprintf " if (MEMCPY_S (__tmp, ocalloc_size, %s, %s)) {" name len_var;
1813+ sprintf " if (memcpy_verw_s (__tmp, ocalloc_size, %s, %s)) {" name len_var;
18051814 sprintf " \t\t %s();" sgx_ocfree_fn;
18061815 " \t\t return SGX_ERROR_UNEXPECTED;" ;
18071816 " \t }" ;
@@ -1811,7 +1820,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18111820 if deep_copy_out = " " then non_deep_copy_out else deep_copy_out
18121821 in
18131822 let assign_tmp_to_ptr = [
1814- sprintf " \t if (MEMCPY_S (&%s, sizeof(%s), &__tmp, sizeof(%s))) {"
1823+ sprintf " \t if (memcpy_verw_s (&%s, sizeof(%s), &__tmp, sizeof(%s))) {"
18151824 parm_accessor
18161825 tystr
18171826 tystr;
@@ -1830,7 +1839,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18301839 ]
18311840 @ check_size @
18321841 [
1833- sprintf " \t MEMSET (__tmp_%s, 0, %s);" name len_var;
1842+ sprintf " \t memset_verw (__tmp_%s, 0, %s);" name len_var;
18341843 sprintf " \t __tmp = (void *)((size_t)__tmp + %s);" len_var;
18351844 sprintf " \t ocalloc_size -= %s;" len_var;
18361845 " } else {" ;
@@ -1887,8 +1896,8 @@ let tproxy_fill_structure(pd: Ast.pdecl) (is_ocall_switchless: bool)=
18871896 [
18881897 sprintf " %s = %s;" len_member_name (gen_struct_ptr_size ty attr name para_struct);
18891898 sprintf " \t if (%s != NULL && %s != 0) {" para_struct_member len_member_name;
1890- sprintf " \t\t if (MEMCPY_S (__tmp, %s, %s, %s) ||" len_member_name para_struct_member len_member_name;
1891- sprintf " \t\t\t MEMCPY_S (&%s, sizeof(%s), &__tmp, sizeof(%s))) {" in_struct_member (Ast. get_tystr ty) (Ast. get_tystr ty);
1899+ sprintf " \t\t if (memcpy_verw_s (__tmp, %s, %s, %s) ||" len_member_name para_struct_member len_member_name;
1900+ sprintf " \t\t\t memcpy_verw_s (&%s, sizeof(%s), &__tmp, sizeof(%s))) {" in_struct_member (Ast. get_tystr ty) (Ast. get_tystr ty);
18921901 sprintf " \t\t\t %s();" sgx_ocfree_fn;
18931902 " \t\t\t return SGX_ERROR_UNEXPECTED;" ;
18941903 " \t\t }" ;
@@ -2224,7 +2233,12 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
22242233 Ast. PTVal _ -> acc
22252234 | Ast. PTPtr (ty , attr ) -> acc ^ copy_memory ty attr declr) " " plist in
22262235
2227- let set_errno = if propagate_errno then " \t\t errno = ms->ocall_errno;\n " else " " in
2236+ let set_errno = if propagate_errno then sprintf " %s\n %s\n %s\n %s\n "
2237+ " \t\t if (memcpy_s((void*)&errno, sizeof(errno), &ms->ocall_errno, sizeof(ms->ocall_errno))) {"
2238+ (sprintf " \t\t\t %s();" sgx_ocfree_fn)
2239+ " \t\t\t return SGX_ERROR_UNEXPECTED;"
2240+ " \t\t }"
2241+ else " " in
22282242 let func_close = sprintf " %s%s%s\n %s%s\n "
22292243 (handle_out_ptr fd.Ast. plist)
22302244 set_errno
@@ -2234,8 +2248,13 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
22342248 let sgx_ocall_fn = get_sgx_fname SGX_OCALL ufunc.Ast. uf_is_switchless in
22352249 let ocall_null = sprintf " \t status = %s(%d, NULL);\n " sgx_ocall_fn idx in
22362250 let ocall_with_ms = sprintf " \t status = %s(%d, %s);\n " sgx_ocall_fn idx ms_struct_val in
2237- let update_retval = sprintf " \t\t if (%s) *%s = %s;"
2238- retval_name retval_name (mk_parm_accessor retval_name) in
2251+ let update_retval = sprintf " %s\n %s\n %s\n %s\n %s\n %s"
2252+ (sprintf " \t\t if (%s) {" retval_name)
2253+ (sprintf " \t\t\t if (memcpy_s((void*)%s, sizeof(*%s), &%s, sizeof(%s))) {" retval_name retval_name (mk_parm_accessor retval_name) (mk_parm_accessor retval_name))
2254+ (sprintf " \t\t\t\t %s();" sgx_ocfree_fn)
2255+ " \t\t\t\t return SGX_ERROR_UNEXPECTED;"
2256+ " \t\t\t }"
2257+ " \t\t }" in
22392258 let func_body = ref [] in
22402259 if (is_naked_func fd) && (propagate_errno = false ) then
22412260 sprintf " %s%s%s%s" func_open local_vars ocall_null " \n\t return status;\n }"
0 commit comments