phala_wasmer_tunables/
lib.rs1use std::ptr::NonNull;
2
3use wasmer::{
4 vm::{self, MemoryError, MemoryStyle, TableStyle, VMMemoryDefinition, VMTableDefinition},
5 MemoryType, Pages, TableType, Tunables,
6};
7
8pub struct LimitingTunables<T: Tunables> {
13 limit: Pages,
17 base: T,
19}
20
21impl<T: Tunables> LimitingTunables<T> {
22 pub fn new(base: T, limit: Pages) -> Self {
23 Self { limit, base }
24 }
25
26 fn adjust_memory(&self, requested: &MemoryType) -> MemoryType {
31 let mut adjusted = *requested;
32 if requested.maximum.is_none() {
33 adjusted.maximum = Some(self.limit);
34 }
35 adjusted
36 }
37
38 fn validate_memory(&self, ty: &MemoryType) -> Result<(), MemoryError> {
41 if ty.minimum > self.limit {
42 return Err(MemoryError::Generic(
43 "Minimum exceeds the allowed memory limit".to_string(),
44 ));
45 }
46
47 if let Some(max) = ty.maximum {
48 if max > self.limit {
49 return Err(MemoryError::Generic(
50 "Maximum exceeds the allowed memory limit".to_string(),
51 ));
52 }
53 } else {
54 return Err(MemoryError::Generic("Maximum unset".to_string()));
55 }
56
57 Ok(())
58 }
59}
60
61impl<T: Tunables> Tunables for LimitingTunables<T> {
62 fn memory_style(&self, memory: &MemoryType) -> MemoryStyle {
66 let adjusted = self.adjust_memory(memory);
67 self.base.memory_style(&adjusted)
68 }
69
70 fn table_style(&self, table: &TableType) -> TableStyle {
74 self.base.table_style(table)
75 }
76
77 fn create_host_memory(
81 &self,
82 ty: &MemoryType,
83 style: &MemoryStyle,
84 ) -> Result<vm::VMMemory, MemoryError> {
85 let adjusted = self.adjust_memory(ty);
86 self.validate_memory(&adjusted)?;
87 self.base.create_host_memory(&adjusted, style)
88 }
89
90 unsafe fn create_vm_memory(
94 &self,
95 ty: &MemoryType,
96 style: &MemoryStyle,
97 vm_definition_location: NonNull<VMMemoryDefinition>,
98 ) -> Result<vm::VMMemory, MemoryError> {
99 let adjusted = self.adjust_memory(ty);
100 self.validate_memory(&adjusted)?;
101 self.base
102 .create_vm_memory(&adjusted, style, vm_definition_location)
103 }
104
105 fn create_host_table(&self, ty: &TableType, style: &TableStyle) -> Result<vm::VMTable, String> {
109 self.base.create_host_table(ty, style)
110 }
111
112 unsafe fn create_vm_table(
116 &self,
117 ty: &TableType,
118 style: &TableStyle,
119 vm_definition_location: NonNull<VMTableDefinition>,
120 ) -> Result<vm::VMTable, String> {
121 self.base.create_vm_table(ty, style, vm_definition_location)
122 }
123}