else if (action == SCMP_ACT_LOG)
a = SCMP_ACT_LOG;
#endif
- else if (action != SCMP_ACT_ALLOW && error >= 0)
+ else if (error >= 0)
a = SCMP_ACT_ERRNO(error);
r = seccomp_rule_add_exact(seccomp, a, id, 0);
return 0;
}
- /* If we previously wanted to forbid a syscall and now
- * we want to allow it, then remove it from the list. */
- if (!(flags & SECCOMP_PARSE_INVERT) == !!(flags & SECCOMP_PARSE_ALLOW_LIST)) {
+ /* If we previously wanted to forbid a syscall and now we want to allow it, then remove
+ * it from the list. The entries in allow-list with non-negative error value will be
+ * handled with SCMP_ACT_ERRNO() instead of the default action. */
+ if (!FLAGS_SET(flags, SECCOMP_PARSE_INVERT) == FLAGS_SET(flags, SECCOMP_PARSE_ALLOW_LIST) ||
+ (FLAGS_SET(flags, SECCOMP_PARSE_INVERT | SECCOMP_PARSE_ALLOW_LIST) && errno_num >= 0)) {
r = hashmap_put(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num));
if (r < 0)
switch (r) {