seccomp: refactor error handling#2023
Conversation
Summary of ChangesHello @eriksjolund, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the robustness and correctness of seccomp-related error handling within the Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request refactors the error handling in the seccomp-related functions get_seccomp_operator and get_seccomp_action. The changes correctly address an error leak where specific error information was being discarded, and fix a bug where an error return value was ambiguous and could be misinterpreted as a valid seccomp action. The new implementation uses a standard C pattern of returning an error code and passing values via output parameters, which improves robustness and clarity. The changes are well-implemented and correctly applied at all call sites. Overall, this is a great improvement to the code's correctness and maintainability.
|
I'm not quite sure about what types to use, like for instance I see for example that |
|
TMT tests failed. @containers/packit-build please check. |
kolyshkin
left a comment
There was a problem hiding this comment.
In general I like the direction; left a few comments.
src/libcrun/seccomp.c
Outdated
| *op = SCMP_CMP_NE; | ||
| return 0; | ||
| } | ||
| else if (strcmp (name, "SCMP_CMP_LT") == 0) |
There was a problem hiding this comment.
Strictly speaking, else is redundant here because there's a return before it. I'd remove it for simplicity.
There was a problem hiding this comment.
We can also apply the same optimization as in get_seccomp_action, i.e. compare against the common prefix first and error out early, then compare only for "LE", "EQ" etc. This is a separate thing to do, or course.
There was a problem hiding this comment.
Also, maybe we can keep the code simple by having a function which does what the current code does, i.e.
static enum scmp_compare
get_seccomp_operator_raw(const char *name)
{
if (strcmp (name, "SCMP_CMP_NE") == 0)
return SCMP_CMP_NE;
// etc.
return _SCMP_CMP_MIN; // Error.
}when add a second wrapper function which will make and return a proper error:
static int
get_seccomp_operator (const char *name, enum scmp_compare *op, libcrun_error_t *err)
{
*op = get_seccomp_operator_raw(name);
if (UNLIKELY (*op == _SCMP_CMP_MIN))
// make and return an error
return 0;
}This way we'll keep the code which does bunch of if strcmp simple.
There was a problem hiding this comment.
Good thoughts. Now fixed.
If you want I could also do another common prefix optimization:
for (i = 0; i < seccomp_flags_len; i++)
{
const char *p;
p = seccomp_flags[i];
if (strncmp (p, "SECCOMP_FILTER_FLAG_", 20))
return crun_make_error (err, 0, "unknown seccomp option `%s`", seccomp_flags[i]);
p += 20;
if (strcmp (p, "TSYNC") == 0)
flags |= SECCOMP_FILTER_FLAG_TSYNC;
else if (strcmp (p, "SPEC_ALLOW") == 0)
flags |= SECCOMP_FILTER_FLAG_SPEC_ALLOW;
else if (strcmp (p, "LOG") == 0)
flags |= SECCOMP_FILTER_FLAG_LOG;
else if (strcmp (p, "WAIT_KILLABLE_RECV") == 0)
flags |= SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV;
else
return crun_make_error (err, 0, "unknown seccomp option `%s`", seccomp_flags[i]);
}
}
I don't know what is best.
If you want I could also remove unnecessary else in get_seccomp_action().
These were already present in the code. The PR currently doesn't modify them.
75e4fd3 to
fdfa1f4
Compare
Fix error leak. Fix incorrect assumption about err value. Closes: containers#2021 Closes: containers#2022 Co-authored-by: Kir Kolyshkin <[email protected]> Signed-off-by: Erik Sjölund <[email protected]>
Optimize common prefix comparison in get_seccomp_operator_raw Suggested-by: Kir Kolyshkin <[email protected]> Signed-off-by: Erik Sjölund <[email protected]>
fdfa1f4 to
f5a652a
Compare
| static unsigned long long | ||
| get_seccomp_action (const char *name, int errno_ret, libcrun_error_t *err) | ||
| static int | ||
| get_seccomp_action (const char *name, int errno_ret, uint32_t *action, libcrun_error_t *err) |
There was a problem hiding this comment.
Perhaps get_seccomp_action can also benefit from the same thing done with get_seccomp_operator? You can probably use ~0U as an error value.
Fix error leak.
Fix incorrect assumption about err value.
Optimize common prefix comparison.
Closes: #2021
Closes: #2022