-
Notifications
You must be signed in to change notification settings - Fork 133
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
trace2: prevent segfault on config collection where no value specified #1814
base: master
Are you sure you want to change the base?
Conversation
Welcome to GitGitGadgetHi @ad-murray, and welcome to GitGitGadget, the GitHub App to send patch series to the Git mailing list from GitHub Pull Requests. Please make sure that either:
You can CC potential reviewers by adding a footer to the PR description with the following syntax:
NOTE: DO NOT copy/paste your CC list from a previous GGG PR's description, Also, it is a good idea to review the commit messages one last time, as the Git project expects them in a quite specific form:
It is in general a good idea to await the automated test ("Checks") in this Pull Request before contributing the patches, e.g. to avoid trivial issues such as unportable code. Contributing the patchesBefore you can contribute the patches, your GitHub username needs to be added to the list of permitted users. Any already-permitted user can do that, by adding a comment to your PR of the form Both the person who commented An alternative is the channel
Once on the list of permitted usernames, you can contribute the patches to the Git mailing list by adding a PR comment If you want to see what email(s) would be sent for a After you submit, GitGitGadget will respond with another comment that contains the link to the cover letter mail in the Git mailing list archive. Please make sure to monitor the discussion in that thread and to address comments and suggestions (while the comments and suggestions will be mirrored into the PR by GitGitGadget, you will still want to reply via mail). If you do not want to subscribe to the Git mailing list just to be able to respond to a mail, you can download the mbox from the Git mailing list archive (click the curl -g --user "<EMailAddress>:<Password>" \
--url "imaps://imap.gmail.com/INBOX" -T /path/to/raw.txt To iterate on your change, i.e. send a revised patch or patch series, you will first want to (force-)push to the same branch. You probably also want to modify your Pull Request description (or title). It is a good idea to summarize the revision by adding something like this to the cover letter (read: by editing the first comment on the PR, i.e. the PR description):
To send a new iteration, just add another PR comment with the contents: Need help?New contributors who want advice are encouraged to join [email protected], where volunteers who regularly contribute to Git are willing to answer newbie questions, give advice, or otherwise provide mentoring to interested contributors. You must join in order to post or view messages, but anyone can join. You may also be able to find help in real time in the developer IRC channel, |
There are issues in commit 2d4ddcf: |
/allow ad-murray |
User ad-murray is now allowed to use GitGitGadget. WARNING: ad-murray has no public email address set on GitHub; |
2d4ddcf
to
976bdf6
Compare
There are issues in commit 976bdf6: |
976bdf6
to
b696097
Compare
There are issues in commit b696097: |
Please follow the guidance in https://github.blog/2022-06-30-write-better-commits-build-better-projects/ to improve it, in particular with a strong focus on this part:
In this instance, the commit message could explain, for example, why the
The Git project requires you to "sign off" your work, please amend the commit accordingly and force-push. |
b696097
to
9b505b7
Compare
There are issues in commit 9b505b7: |
9b505b7
to
48ffb81
Compare
There are issues in commit 48ffb81: |
48ffb81
to
c35764e
Compare
Commit message updated, is there a way to re-run the failing checks? |
Well, those checks fail because the patch introduces a regression. In particular t1300.131 documents that Speaking of test cases: You described one in the commit message. How about moving it from the commit message into an actual test script, to verify that the described regression is fixed (and to prevent future regressions going unnoticed)? As to the fix for the segmentation fault: I think this diff, or a variation thereof, should be the correct fix: diff --git a/trace2.c b/trace2.c
index f894532d0533..6cae41ca61c4 100644
--- a/trace2.c
+++ b/trace2.c
@@ -259,7 +259,7 @@ static const char *redact_arg(const char *arg)
const char *p, *colon;
size_t at;
- if (!trace2_redact ||
+ if (!trace2_redact || !arg ||
(!skip_prefix(arg, "https://", &p) &&
!skip_prefix(arg, "http://", &p)))
return arg; |
right you are, will do |
0c5d185
to
25cd431
Compare
/submit |
1 similar comment
/submit |
fe611b8
to
b4e30d8
Compare
/submit |
Error: Ignoring PR with empty title and/or body |
@ad-murray This means that GitGitGadget requires a cover letter (which is composed of the PR title, and the PR description, i.e. the initial comment). However, in this instance I am convinced that you do not want to contribute three patches; Instead, you will want to "squash" them into a single commit. Once you do that, you do not need to populate the initial comment with content for a cover letter, as none will be sent for single-patch contributions, as per the Git maintainer's request. |
b4e30d8
to
2253303
Compare
There are issues in commit 2253303: |
When TRACE2 analytics is enabled, a git config option that has no value causes a segfault. Steps to Reproduce GIT_TRACE2=true GIT_TRACE2_CONFIG_PARAMS=status.* git -c status.relativePaths version Expected Result git version 2.46.0 Actual Result zsh: segmentation fault GIT_TRACE2=true This adds a null check to prevent the segfault and instead return the "empty config value" error. Signed-off-by: Adam Murray <[email protected]>
2253303
to
24ba9db
Compare
/submit |
Submitted as [email protected] To fetch this version into
To fetch this version to local tag
|
On the Git mailing list, Jeff King wrote (reply to this): On Thu, Nov 07, 2024 at 12:04:48AM +0000, Adam Murray via GitGitGadget wrote:
> When TRACE2 analytics is enabled, a git config option that has no value
> causes a segfault.
>
> Steps to Reproduce
> GIT_TRACE2=true GIT_TRACE2_CONFIG_PARAMS=status.*
> git -c status.relativePaths version
> Expected Result
> git version 2.46.0
> Actual Result
> zsh: segmentation fault GIT_TRACE2=true
>
> This adds a null check to prevent the segfault and instead return
> the "empty config value" error.
We definitely should deal with the NULL here, but I'm not sure that
returning an error is correct. A value-less config like this is a
synonym for "true". If the point of this code is to dump a trace of
config settings, then by returning without printing anything, we're
misleading the user.
I.e., doing this, with an explicit value for the config option:
GIT_TRACE2=true GIT_TRACE2_CONFIG_PARAMS=status.* git -c status.relativePaths=true version
should (and does) show:
20:48:11.662470 trace2.c:437 def_param scope:command status.relativepaths=true
If we swap that our for "-c status.relativePaths", then the outcome is
the same: we've turned on that config option. But with your patch, the
trace won't mention it at all.
> diff --git a/trace2.c b/trace2.c
> index f894532d053..5df43478b8f 100644
> --- a/trace2.c
> +++ b/trace2.c
> @@ -759,7 +759,7 @@ void trace2_def_param_fl(const char *file, int line, const char *param,
> int j;
> const char *redacted;
>
> - if (!trace2_enabled)
> + if (!trace2_enabled || !value)
> return;
>
> redacted = redact_arg(value);
So here I think we need to either:
1. Just quietly substitute "true" for the value. For a bool, the two
are equivalent, and this is probably an acceptable fiction for a
trace to show. For a non-bool (e.g., something like "author.name"),
though, it's an error, and the trace is somewhat misleading.
2. Put in some special marker for the NULL value. Something like
"(null)" works, but it's ambiguous with a config of the same value
(which obviously you wouldn't expect in normal use, but since the
point of tracing is often to debug, I could see it being
misleading).
All of this is made harder by the fact that there are multiple output
targets. So you'd have to pass the NULL down to them and let them handle
it. Something like:
diff --git a/trace2.c b/trace2.c
index 5df43478b8..e67edf4b1b 100644
--- a/trace2.c
+++ b/trace2.c
@@ -759,10 +759,10 @@ void trace2_def_param_fl(const char *file, int line, const char *param,
int j;
const char *redacted;
- if (!trace2_enabled || !value)
+ if (!trace2_enabled)
return;
- redacted = redact_arg(value);
+ redacted = value ? redact_arg(value) : NULL;
for_each_wanted_builtin (j, tgt_j)
if (tgt_j->pfn_param_fl)
diff --git a/trace2/tr2_tgt_normal.c b/trace2/tr2_tgt_normal.c
index baef48aa69..924736ab36 100644
--- a/trace2/tr2_tgt_normal.c
+++ b/trace2/tr2_tgt_normal.c
@@ -307,8 +307,9 @@ static void fn_param_fl(const char *file, int line, const char *param,
enum config_scope scope = kvi->scope;
const char *scope_name = config_scope_name(scope);
- strbuf_addf(&buf_payload, "def_param scope:%s %s=%s", scope_name, param,
- value);
+ strbuf_addf(&buf_payload, "def_param scope:%s %s", scope_name, param);
+ if (value)
+ strbuf_addf(&buf_payload, "=%s", value);
normal_io_write_fl(file, line, &buf_payload);
strbuf_release(&buf_payload);
}
but you'd need to do the same for each target implementation.
-Peff |
User |
On the Git mailing list, Junio C Hamano wrote (reply to this): Jeff King <[email protected]> writes:
> I.e., doing this, with an explicit value for the config option:
>
> GIT_TRACE2=true GIT_TRACE2_CONFIG_PARAMS=status.* git -c status.relativePaths=true version
>
> should (and does) show:
>
> 20:48:11.662470 trace2.c:437 def_param scope:command status.relativepaths=true
>
> If we swap that our for "-c status.relativePaths", then the outcome is
> the same: we've turned on that config option. But with your patch, the
> trace won't mention it at all.
which may be improvement, but ideally, the "valueless truth" case
should be given differently, perhaps like
20:48:11.662470 trace2.c:437 def_param scope:command status.relativepaths
to allow showing what exactly the system has seen. After all, trace
output is often used for debugging, and it is not unusual for a
buggy code path to behave on explicit truth and valueless truth
differently.
> So here I think we need to either:
>
> 1. Just quietly substitute "true" for the value. For a bool, the two
> are equivalent, and this is probably an acceptable fiction for a
> trace to show. For a non-bool (e.g., something like "author.name"),
> though, it's an error, and the trace is somewhat misleading.
>
> 2. Put in some special marker for the NULL value. Something like
> "(null)" works, but it's ambiguous with a config of the same value
> (which obviously you wouldn't expect in normal use, but since the
> point of tracing is often to debug, I could see it being
> misleading).
>
> All of this is made harder by the fact that there are multiple output
> targets. So you'd have to pass the NULL down to them and let them handle
> it. Something like:
> ...
> diff --git a/trace2/tr2_tgt_normal.c b/trace2/tr2_tgt_normal.c
> index baef48aa69..924736ab36 100644
> --- a/trace2/tr2_tgt_normal.c
> +++ b/trace2/tr2_tgt_normal.c
> @@ -307,8 +307,9 @@ static void fn_param_fl(const char *file, int line, const char *param,
> enum config_scope scope = kvi->scope;
> const char *scope_name = config_scope_name(scope);
>
> - strbuf_addf(&buf_payload, "def_param scope:%s %s=%s", scope_name, param,
> - value);
> + strbuf_addf(&buf_payload, "def_param scope:%s %s", scope_name, param);
> + if (value)
> + strbuf_addf(&buf_payload, "=%s", value);
Yes, exactly.
> normal_io_write_fl(file, line, &buf_payload);
> strbuf_release(&buf_payload);
> }
>
> but you'd need to do the same for each target implementation.
Thanks. |
cc: Jeff King [email protected]