@@ -211,11 +211,13 @@ let retval_declr = { Ast.identifier = retval_name; Ast.array_dims = []; }
211
211
let eid_name = " eid"
212
212
let ms_ptr_name = " pms"
213
213
let ms_struct_val = " ms"
214
+ let ms_in_struct_val = " __in_ms"
214
215
let mk_ms_member_name (pname : string ) = " ms_" ^ pname
215
216
let mk_ms_struct_name (fname : string ) = " ms_" ^ fname ^ " _t"
216
217
let ms_retval_name = mk_ms_member_name retval_name
217
218
let mk_tbridge_name (fname : string ) = " sgx_" ^ fname
218
219
let 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)
219
221
let mk_tmp_var name = " _tmp_" ^ name
220
222
let mk_tmp_var2 name1 name2 = " _tmp_" ^ name1 ^ " _" ^ name2
221
223
let mk_len_var name = " _len_" ^ name
@@ -242,14 +244,6 @@ extern \"C\" {\n\
242
244
(* Header footer *)
243
245
let header_footer = " \n #ifdef __cplusplus\n }\n #endif /* __cplusplus */\n\n #endif\n "
244
246
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
-
253
247
(* Little functions for generating file names. *)
254
248
let get_uheader_short_name (file_shortnm : string ) = file_shortnm ^ " _u.h"
255
249
let get_uheader_name (file_shortnm : string ) =
@@ -738,7 +732,7 @@ let gen_theader_preemble (guard: string) (inclist: string) =
738
732
#include <wchar.h>\n \
739
733
#include <stddef.h>\n \
740
734
#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
742
736
743
737
(* Generate trusted header for enclave *)
744
738
let gen_trusted_header (ec : enclave_content ) =
@@ -761,7 +755,7 @@ let gen_trusted_header (ec: enclave_content) =
761
755
close_out out_chan
762
756
763
757
(* 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 ) =
765
759
let cast_expr =
766
760
let tystr = get_param_tystr pt in
767
761
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) =
770
764
sprintf " (%s (*)%s)" tystr dims
771
765
else " "
772
766
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
774
768
775
769
(* We passed foreign array `foo_array_t foo' as `&foo[0]', thus we
776
770
* need to get back `foo' by '* array_ptr' where
777
771
* array_ptr = &foo[0]
778
772
*)
779
773
let 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 ) =
784
776
if is_foreign_array pt
785
777
then sprintf " (%s != NULL) ? (*%s) : NULL" arg arg
786
778
else arg
787
779
788
780
let 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
790
782
791
783
let mk_parm_name_ext (pt : Ast.parameter_type ) (declr : Ast.declarator ) =
792
784
let name = declr.Ast. identifier in
793
785
match pt with
794
- Ast. PTVal _ -> mk_parm_name_raw pt declr
786
+ Ast. PTVal _ -> mk_parm_name_raw pt declr true
795
787
| Ast. PTPtr (_ , attr ) ->
796
788
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
798
790
| _ -> mk_in_var name
799
791
800
792
let 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:
968
960
else
969
961
(* genrerate ms_parm_len only for ecall with string/wstring in _t.c.*)
970
962
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)
972
964
else
973
965
(* genrerate strlen(param)/wcslen(param) only for ocall with string/wstring in _t.c.*)
974
966
if pattr.Ast. pa_isstr then
@@ -1407,7 +1399,7 @@ let gen_struct_ptr_direction_post (param_direction: Ast.ptr_direction) (struct_t
1407
1399
" \t\t status = SGX_ERROR_INVALID_PARAMETER;" ;
1408
1400
" \t\t break;" ;
1409
1401
" \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;
1411
1403
sprintf " \t\t status = SGX_ERROR_UNEXPECTED;" ;
1412
1404
" \t\t break;" ;
1413
1405
" \t }" ;
@@ -1449,7 +1441,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
1449
1441
" \t {" ;
1450
1442
sprintf " \t\t %s[%s - 1] = '\\ 0';" in_ptr_name len_var;
1451
1443
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;
1453
1445
" \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
1454
1446
" \t\t\t goto err;" ;
1455
1447
" \t\t }" ;
@@ -1463,7 +1455,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
1463
1455
" \t {" ;
1464
1456
sprintf " \t\t %s[(%s - sizeof(wchar_t))/sizeof(wchar_t)] = (wchar_t)0;" in_ptr_name len_var;
1465
1457
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;
1467
1459
" \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
1468
1460
" \t\t\t goto err;" ;
1469
1461
" \t\t }" ;
@@ -1474,7 +1466,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
1474
1466
else
1475
1467
let code_template = [
1476
1468
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;
1478
1470
" \t\t\t status = SGX_ERROR_UNEXPECTED;" ;
1479
1471
" \t\t\t goto err;" ;
1480
1472
" \t\t }" ;
@@ -1547,7 +1539,7 @@ let gen_tmp_size (pattr: Ast.ptr_attr) (plist: Ast.pdecl list) =
1547
1539
else
1548
1540
let param_tystr = find_param_type s plist in
1549
1541
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
1551
1543
Hashtbl. add param_cache s true ;
1552
1544
sprintf " \t %s %s = %s;\n " param_tystr tmp_var parm_str
1553
1545
in
@@ -1602,7 +1594,7 @@ let tbridge_mk_parm_name_ext (pt: Ast.parameter_type) (declr: Ast.declarator) =
1602
1594
else mk_parm_name_ext pt declr
1603
1595
1604
1596
let 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
1606
1598
1607
1599
(* Generate local variables required for the trusted bridge. *)
1608
1600
let gen_tbridge_local_vars (plist : Ast.pdecl list ) =
@@ -1612,7 +1604,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
1612
1604
let ty = Ast. get_param_atype pt in
1613
1605
let tmp_var =
1614
1606
(* 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)
1616
1608
in
1617
1609
let len_var =
1618
1610
if not attr.Ast. pa_chkptr then " "
@@ -1637,7 +1629,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
1637
1629
let gen_local_var_for_foreign_array (ty : Ast.atype ) (attr : Ast.ptr_attr ) (name : string ) =
1638
1630
let tystr = Ast. get_tystr ty in
1639
1631
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)
1641
1633
in
1642
1634
let len_var = sprintf " \t size_t %s = sizeof(%s);\n " (mk_len_var name) tystr
1643
1635
in
@@ -1681,13 +1673,28 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
1681
1673
ms_struct_val
1682
1674
ms_struct_name
1683
1675
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
1684
1691
1685
1692
let invoke_func = gen_func_invoking fd mk_parm_name_tbridge in
1686
1693
1687
1694
let update_retval =
1688
1695
let code_template = [
1689
1696
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))) {"
1691
1698
(mk_parm_accessor retval_name)
1692
1699
(mk_parm_accessor retval_name)
1693
1700
(mk_in_var retval_name)
@@ -1705,10 +1712,12 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
1705
1712
in
1706
1713
sprintf " %s%s%s\t %s\n\t %s\n %s" func_open local_vars dummy_var check_pms invoke_func func_close
1707
1714
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"
1709
1716
func_open
1710
1717
(mk_check_pms fd.Ast. fname)
1711
1718
declare_ms_ptr
1719
+ declare_ms
1720
+ copy_ms
1712
1721
local_vars
1713
1722
(gen_check_tbridge_length_overflow fd.Ast. plist)
1714
1723
(gen_check_tbridge_ptr_parms fd.Ast. plist)
@@ -1726,7 +1735,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
1726
1735
let parm_accessor = mk_parm_accessor name in
1727
1736
let sgx_ocfree_fn = get_sgx_fname SGX_OCFREE is_ocall_switchless in
1728
1737
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))) {"
1730
1739
parm_accessor
1731
1740
parm_accessor
1732
1741
name
@@ -1786,7 +1795,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
1786
1795
in
1787
1796
let post =
1788
1797
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;
1790
1799
sprintf " \t\t %s();" sgx_ocfree_fn;
1791
1800
" \t\t return SGX_ERROR_UNEXPECTED;" ;
1792
1801
" \t }" ;
@@ -1801,7 +1810,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
1801
1810
let non_deep_copy_out =
1802
1811
let code_template =
1803
1812
[
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;
1805
1814
sprintf " \t\t %s();" sgx_ocfree_fn;
1806
1815
" \t\t return SGX_ERROR_UNEXPECTED;" ;
1807
1816
" \t }" ;
@@ -1811,7 +1820,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
1811
1820
if deep_copy_out = " " then non_deep_copy_out else deep_copy_out
1812
1821
in
1813
1822
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))) {"
1815
1824
parm_accessor
1816
1825
tystr
1817
1826
tystr;
@@ -1830,7 +1839,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
1830
1839
]
1831
1840
@ check_size @
1832
1841
[
1833
- sprintf " \t MEMSET (__tmp_%s, 0, %s);" name len_var;
1842
+ sprintf " \t memset_verw (__tmp_%s, 0, %s);" name len_var;
1834
1843
sprintf " \t __tmp = (void *)((size_t)__tmp + %s);" len_var;
1835
1844
sprintf " \t ocalloc_size -= %s;" len_var;
1836
1845
" } else {" ;
@@ -1887,8 +1896,8 @@ let tproxy_fill_structure(pd: Ast.pdecl) (is_ocall_switchless: bool)=
1887
1896
[
1888
1897
sprintf " %s = %s;" len_member_name (gen_struct_ptr_size ty attr name para_struct);
1889
1898
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);
1892
1901
sprintf " \t\t\t %s();" sgx_ocfree_fn;
1893
1902
" \t\t\t return SGX_ERROR_UNEXPECTED;" ;
1894
1903
" \t\t }" ;
@@ -2224,7 +2233,12 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
2224
2233
Ast. PTVal _ -> acc
2225
2234
| Ast. PTPtr (ty , attr ) -> acc ^ copy_memory ty attr declr) " " plist in
2226
2235
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
2228
2242
let func_close = sprintf " %s%s%s\n %s%s\n "
2229
2243
(handle_out_ptr fd.Ast. plist)
2230
2244
set_errno
@@ -2234,8 +2248,13 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
2234
2248
let sgx_ocall_fn = get_sgx_fname SGX_OCALL ufunc.Ast. uf_is_switchless in
2235
2249
let ocall_null = sprintf " \t status = %s(%d, NULL);\n " sgx_ocall_fn idx in
2236
2250
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
2239
2258
let func_body = ref [] in
2240
2259
if (is_naked_func fd) && (propagate_errno = false ) then
2241
2260
sprintf " %s%s%s%s" func_open local_vars ocall_null " \n\t return status;\n }"
0 commit comments