-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Fix halt_error to print message without prefix in raw mode (fix #1902) #2632
Conversation
This got me thinking if we want $ jq -rn '"a\u0000b" | halt_error' 2>&1 | hexdump -C
00000000 6a 71 3a 20 65 72 72 6f 72 3a 20 61 |jq: error: a|
0000000c
$ jq -rn '"a\u0000b"' | hexdump -C
00000000 61 00 62 0a |a.b.|
00000004 |
@wader Good catch, let's do so. The manual says |
8d68b83
to
f6f2a7b
Compare
fprintf(stderr, "jq: error: %s", jv_string_value(error_message)); | ||
// No prefix should be added to the output of `halt_error`. | ||
fwrite(jv_string_value(error_message), 1, | ||
jv_string_length_bytes(jv_copy(error_message)), stderr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess we don't leak the jv
copy here as jv_string_length_bytes
free/unref? I will have to read up on how the ownership works for the jv
type and functions, eg why does jv_string_value
not free/unref?
@itchyny 👍 good catch on notice the manual say raw string |
fi | ||
if [ "$($VALGRIND $Q $JQ -n '"x\u0000y\u0000z" | halt_error(1)' 2>&1)" != "$(printf 'x\x00y\x00z')" ]; then | ||
echo "jq halt_error(1) had unexpected output" 1>&2 | ||
exit 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems linux build is not happy about this:
+ /home/runner/work/jq/jq/tests/../jq -n halt_error(1)
+ [ 1 -ne 1 ]
+ /home/runner/work/jq/jq/tests/../jq -n halt_error(11)
+ [ 11 -ne 11 ]
+ /home/runner/work/jq/jq/tests/../jq -n halt_error(1)
+ [ -n ]
+ /home/runner/work/jq/jq/tests/../jq -n "xyz\n" | halt_error(1)
+ [ -n ]
+ /home/runner/work/jq/jq/tests/../jq -n "xy" | halt_error(1)
+ echo z
+ [ xyz != xyz ]
+ /home/runner/work/jq/jq/tests/../jq -n "x\u0000y\u0000z" | halt_error(1)
+ printf x\x00y\x00z
+ [ xyz != x\x00y\x00z ]
+ echo jq halt_error(1) had unexpected output
jq halt_error(1) had unexpected output
+ exit 1
Hmm zero bytes gone from LHS value? shell doing something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, NUL bytes are trimmed in command substitution.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aha, any idea why macOS build was fine?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bash is old. It passes if Bash is 3.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 that explains things, great work!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If necessary, \0
can be used instead of \x00
. That would work in any version bash or POSIX-compliant shell.
f6f2a7b
to
d7839de
Compare
Thank you. |
This PR fixes #1902. The manual says that
halt_error
should print the input with no decoration . This is a regression of 2b4d51f, which is after 1.6.