@@ -813,54 +813,65 @@ libcrun_generate_seccomp (struct libcrun_seccomp_gen_ctx_s *gen_ctx, libcrun_err
813813 else
814814 {
815815 size_t k ;
816- struct scmp_arg_cmp arg_cmp [6 ];
817816 bool multiple_args = false;
818817 uint32_t count [6 ] = {};
819818
820- for (k = 0 ; k < seccomp -> syscalls [i ]-> args_len && k < 6 ; k ++ )
819+ for (k = 0 ; k < seccomp -> syscalls [i ]-> args_len ; k ++ )
821820 {
822821 uint32_t index ;
823822
824823 index = seccomp -> syscalls [i ]-> args [k ]-> index ;
825824 if (index >= 6 )
826- return crun_make_error (err , 0 , "invalid seccomp index `%zu `" , i );
825+ return crun_make_error (err , 0 , "invalid seccomp index `%u `" , index );
827826
828827 count [index ]++ ;
829828 if (count [index ] > 1 )
830- {
831- multiple_args = true;
832- break ;
833- }
829+ multiple_args = true;
834830 }
835831
836- for (k = 0 ; k < seccomp -> syscalls [i ]-> args_len && k < 6 ; k ++ )
832+ /* If multiple rules refer to the same argument, treat the rules are in OR. */
833+ if (multiple_args )
837834 {
838- char * op = seccomp -> syscalls [ i ] -> args [ k ] -> op ;
835+ size_t r ;
839836
840- arg_cmp [k ].arg = seccomp -> syscalls [i ]-> args [k ]-> index ;
841- ret = get_seccomp_operator (op , & (arg_cmp [k ].op ), err );
842- if (UNLIKELY (ret < 0 ))
843- return ret ;
844- arg_cmp [k ].datum_a = seccomp -> syscalls [i ]-> args [k ]-> value ;
845- arg_cmp [k ].datum_b = seccomp -> syscalls [i ]-> args [k ]-> value_two ;
846- }
837+ for (r = 0 ; r < seccomp -> syscalls [i ]-> args_len ; r ++ )
838+ {
839+ struct scmp_arg_cmp arg_cmp ;
840+ char * op = seccomp -> syscalls [i ]-> args [r ]-> op ;
847841
848- if (! multiple_args )
849- {
850- ret = seccomp_rule_add_array (ctx , action , syscall , k , arg_cmp );
851- if (UNLIKELY (ret < 0 ))
852- return crun_make_error (err , - ret , "seccomp_rule_add_array" );
842+ arg_cmp .arg = seccomp -> syscalls [i ]-> args [r ]-> index ;
843+ ret = get_seccomp_operator (op , & arg_cmp .op , err );
844+ if (UNLIKELY (ret < 0 ))
845+ return ret ;
846+ arg_cmp .datum_a = seccomp -> syscalls [i ]-> args [r ]-> value ;
847+ arg_cmp .datum_b = seccomp -> syscalls [i ]-> args [r ]-> value_two ;
848+
849+ ret = seccomp_rule_add_array (ctx , action , syscall , 1 , & arg_cmp );
850+ if (UNLIKELY (ret < 0 ))
851+ return crun_make_error (err , - ret , "seccomp_rule_add_array" );
852+ }
853853 }
854854 else
855855 {
856- size_t r ;
856+ /* No index is repeated, so there are at most 6 distinct arguments. */
857+ const size_t args_len = seccomp -> syscalls [i ]-> args_len ;
858+ struct scmp_arg_cmp arg_cmp [6 ];
857859
858- for (r = 0 ; r < k ; r ++ )
860+ for (k = 0 ; k < args_len ; k ++ )
859861 {
860- ret = seccomp_rule_add_array (ctx , action , syscall , 1 , & arg_cmp [r ]);
862+ char * op = seccomp -> syscalls [i ]-> args [k ]-> op ;
863+
864+ arg_cmp [k ].arg = seccomp -> syscalls [i ]-> args [k ]-> index ;
865+ ret = get_seccomp_operator (op , & (arg_cmp [k ].op ), err );
861866 if (UNLIKELY (ret < 0 ))
862- return crun_make_error (err , - ret , "seccomp_rule_add_array" );
867+ return ret ;
868+ arg_cmp [k ].datum_a = seccomp -> syscalls [i ]-> args [k ]-> value ;
869+ arg_cmp [k ].datum_b = seccomp -> syscalls [i ]-> args [k ]-> value_two ;
863870 }
871+
872+ ret = seccomp_rule_add_array (ctx , action , syscall , args_len , arg_cmp );
873+ if (UNLIKELY (ret < 0 ))
874+ return crun_make_error (err , - ret , "seccomp_rule_add_array" );
864875 }
865876 }
866877 }
0 commit comments