@@ -124,6 +124,75 @@ fn source_string_invalid(bytes: &[u8], require_non_empty: bool) -> bool {
124124 ( require_non_empty && bytes. is_empty ( ) ) || bytes. contains ( & 0 )
125125}
126126
127+ fn validate_apps_lookup_semantics (
128+ status : u16 ,
129+ cgroup_status : u16 ,
130+ orchestrator : u16 ,
131+ ppid : u32 ,
132+ uid : u32 ,
133+ starttime : u64 ,
134+ comm_len : u64 ,
135+ path_len : u64 ,
136+ name_len : u64 ,
137+ label_count : u64 ,
138+ ) -> Result < ( ) , NipcError > {
139+ if status != PID_LOOKUP_KNOWN && status != PID_LOOKUP_UNKNOWN {
140+ return Err ( NipcError :: BadLayout ) ;
141+ }
142+ if cgroup_status != APPS_CGROUP_KNOWN
143+ && cgroup_status != APPS_CGROUP_UNKNOWN_RETRY_LATER
144+ && cgroup_status != APPS_CGROUP_UNKNOWN_PERMANENT
145+ && cgroup_status != APPS_CGROUP_HOST_ROOT
146+ {
147+ return Err ( NipcError :: BadLayout ) ;
148+ }
149+ if comm_len > 15 {
150+ return Err ( NipcError :: BadLayout ) ;
151+ }
152+ if status == PID_LOOKUP_UNKNOWN {
153+ if orchestrator != 0
154+ || cgroup_status != 0
155+ || ppid != 0
156+ || uid != NIPC_UID_UNSET
157+ || starttime != 0
158+ || comm_len != 0
159+ || path_len != 0
160+ || name_len != 0
161+ || label_count != 0
162+ {
163+ return Err ( NipcError :: BadLayout ) ;
164+ }
165+ return Ok ( ( ) ) ;
166+ }
167+ if comm_len == 0 {
168+ return Err ( NipcError :: BadLayout ) ;
169+ }
170+ match cgroup_status {
171+ APPS_CGROUP_KNOWN => {
172+ if path_len == 0 {
173+ return Err ( NipcError :: BadLayout ) ;
174+ }
175+ }
176+ APPS_CGROUP_UNKNOWN_RETRY_LATER => {
177+ if orchestrator != 0 || name_len != 0 || label_count != 0 {
178+ return Err ( NipcError :: BadLayout ) ;
179+ }
180+ }
181+ APPS_CGROUP_UNKNOWN_PERMANENT => {
182+ if path_len == 0 || orchestrator != 0 || name_len != 0 || label_count != 0 {
183+ return Err ( NipcError :: BadLayout ) ;
184+ }
185+ }
186+ APPS_CGROUP_HOST_ROOT => {
187+ if orchestrator != 0 || path_len != 0 || name_len != 0 || label_count != 0 {
188+ return Err ( NipcError :: BadLayout ) ;
189+ }
190+ }
191+ _ => return Err ( NipcError :: BadLayout ) ,
192+ }
193+ Ok ( ( ) )
194+ }
195+
127196fn validate_lookup_dir (
128197 buf : & [ u8 ] ,
129198 dir_start : usize ,
@@ -1016,59 +1085,18 @@ fn decode_apps_item(item: &[u8]) -> Result<AppsLookupItemView<'_>, NipcError> {
10161085 if u16_at ( item, 0 ) != 1 || u32_at ( item, 20 ) != 0 || u16_at ( item, 58 ) != 0 {
10171086 return Err ( NipcError :: BadLayout ) ;
10181087 }
1019- if status != PID_LOOKUP_KNOWN && status != PID_LOOKUP_UNKNOWN {
1020- return Err ( NipcError :: BadLayout ) ;
1021- }
1022- if cgroup_status != APPS_CGROUP_KNOWN
1023- && cgroup_status != APPS_CGROUP_UNKNOWN_RETRY_LATER
1024- && cgroup_status != APPS_CGROUP_UNKNOWN_PERMANENT
1025- && cgroup_status != APPS_CGROUP_HOST_ROOT
1026- {
1027- return Err ( NipcError :: BadLayout ) ;
1028- }
1029- if comm_len > 15 {
1030- return Err ( NipcError :: BadLayout ) ;
1031- }
1032- if status == PID_LOOKUP_UNKNOWN {
1033- if orchestrator != 0
1034- || cgroup_status != 0
1035- || ppid != 0
1036- || uid != NIPC_UID_UNSET
1037- || starttime != 0
1038- || comm_len != 0
1039- || path_len != 0
1040- || name_len != 0
1041- || label_count != 0
1042- {
1043- return Err ( NipcError :: BadLayout ) ;
1044- }
1045- } else if comm_len == 0 {
1046- return Err ( NipcError :: BadLayout ) ;
1047- } else {
1048- match cgroup_status {
1049- APPS_CGROUP_KNOWN => {
1050- if path_len == 0 {
1051- return Err ( NipcError :: BadLayout ) ;
1052- }
1053- }
1054- APPS_CGROUP_UNKNOWN_RETRY_LATER => {
1055- if orchestrator != 0 || name_len != 0 || label_count != 0 {
1056- return Err ( NipcError :: BadLayout ) ;
1057- }
1058- }
1059- APPS_CGROUP_UNKNOWN_PERMANENT => {
1060- if path_len == 0 || orchestrator != 0 || name_len != 0 || label_count != 0 {
1061- return Err ( NipcError :: BadLayout ) ;
1062- }
1063- }
1064- APPS_CGROUP_HOST_ROOT => {
1065- if orchestrator != 0 || path_len != 0 || name_len != 0 || label_count != 0 {
1066- return Err ( NipcError :: BadLayout ) ;
1067- }
1068- }
1069- _ => return Err ( NipcError :: BadLayout ) ,
1070- }
1071- }
1088+ validate_apps_lookup_semantics (
1089+ status,
1090+ cgroup_status,
1091+ orchestrator,
1092+ ppid,
1093+ uid,
1094+ starttime,
1095+ comm_len as u64 ,
1096+ path_len as u64 ,
1097+ name_len as u64 ,
1098+ label_count as u64 ,
1099+ ) ?;
10721100
10731101 let ( comm, comm_end) = lookup_string ( item, APPS_LOOKUP_ITEM_HDR_SIZE , comm_off, comm_len) ?;
10741102 let ( cgroup_path, path_end) =
@@ -1168,77 +1196,28 @@ impl<'a> AppsLookupBuilder<'a> {
11681196 self . error = Some ( NipcError :: Overflow ) ;
11691197 return Err ( NipcError :: Overflow ) ;
11701198 }
1171- if status != PID_LOOKUP_KNOWN && status != PID_LOOKUP_UNKNOWN {
1172- self . error = Some ( NipcError :: BadLayout ) ;
1173- return Err ( NipcError :: BadLayout ) ;
1174- }
1175- if cgroup_status != APPS_CGROUP_KNOWN
1176- && cgroup_status != APPS_CGROUP_UNKNOWN_RETRY_LATER
1177- && cgroup_status != APPS_CGROUP_UNKNOWN_PERMANENT
1178- && cgroup_status != APPS_CGROUP_HOST_ROOT
1179- {
1180- self . error = Some ( NipcError :: BadLayout ) ;
1181- return Err ( NipcError :: BadLayout ) ;
1199+ if let Err ( err) = validate_apps_lookup_semantics (
1200+ status,
1201+ cgroup_status,
1202+ orchestrator,
1203+ ppid,
1204+ uid,
1205+ starttime,
1206+ comm. len ( ) as u64 ,
1207+ cgroup_path. len ( ) as u64 ,
1208+ cgroup_name. len ( ) as u64 ,
1209+ labels. len ( ) as u64 ,
1210+ ) {
1211+ self . error = Some ( err) ;
1212+ return Err ( err) ;
11821213 }
1183- if comm. len ( ) > 15
1184- || source_string_invalid ( comm, status == PID_LOOKUP_KNOWN )
1214+ if source_string_invalid ( comm, status == PID_LOOKUP_KNOWN )
11851215 || source_string_invalid ( cgroup_path, false )
11861216 || source_string_invalid ( cgroup_name, false )
11871217 {
11881218 self . error = Some ( NipcError :: BadLayout ) ;
11891219 return Err ( NipcError :: BadLayout ) ;
11901220 }
1191- if status == PID_LOOKUP_UNKNOWN {
1192- if orchestrator != 0
1193- || cgroup_status != 0
1194- || ppid != 0
1195- || uid != NIPC_UID_UNSET
1196- || starttime != 0
1197- || !comm. is_empty ( )
1198- || !cgroup_path. is_empty ( )
1199- || !cgroup_name. is_empty ( )
1200- || !labels. is_empty ( )
1201- {
1202- self . error = Some ( NipcError :: BadLayout ) ;
1203- return Err ( NipcError :: BadLayout ) ;
1204- }
1205- } else {
1206- match cgroup_status {
1207- APPS_CGROUP_KNOWN => {
1208- if cgroup_path. is_empty ( ) {
1209- self . error = Some ( NipcError :: BadLayout ) ;
1210- return Err ( NipcError :: BadLayout ) ;
1211- }
1212- }
1213- APPS_CGROUP_UNKNOWN_RETRY_LATER => {
1214- if orchestrator != 0 || !cgroup_name. is_empty ( ) || !labels. is_empty ( ) {
1215- self . error = Some ( NipcError :: BadLayout ) ;
1216- return Err ( NipcError :: BadLayout ) ;
1217- }
1218- }
1219- APPS_CGROUP_UNKNOWN_PERMANENT => {
1220- if cgroup_path. is_empty ( )
1221- || orchestrator != 0
1222- || !cgroup_name. is_empty ( )
1223- || !labels. is_empty ( )
1224- {
1225- self . error = Some ( NipcError :: BadLayout ) ;
1226- return Err ( NipcError :: BadLayout ) ;
1227- }
1228- }
1229- APPS_CGROUP_HOST_ROOT => {
1230- if orchestrator != 0
1231- || !cgroup_path. is_empty ( )
1232- || !cgroup_name. is_empty ( )
1233- || !labels. is_empty ( )
1234- {
1235- self . error = Some ( NipcError :: BadLayout ) ;
1236- return Err ( NipcError :: BadLayout ) ;
1237- }
1238- }
1239- _ => unreachable ! ( ) ,
1240- }
1241- }
12421221 let label_count = match checked_u16 ( labels. len ( ) ) {
12431222 Ok ( v) => v,
12441223 Err ( err) => {
0 commit comments