This commit is contained in:
1 parent
8d9a3c3ab3
commit
5529788292
5 files changed
+39
-20
No files matched your search
+1
-1
@@ -231,7 +231,7 @@ EXTRA_DIST = $(DOC_FILES) $(man_MANS) $(TESTS) $(TEST_LOG_COMPILER) \
|
|||||||
tests/setup tests/torture/input0.json \
|
tests/setup tests/torture/input0.json \
|
||||||
tests/optional.test tests/man.test tests/manonig.test \
|
tests/optional.test tests/man.test tests/manonig.test \
|
||||||
tests/jq.test tests/onig.test tests/base64.test tests/uri.test \
|
tests/jq.test tests/onig.test tests/base64.test tests/uri.test \
|
||||||
tests/utf8-truncate.jq tests/jq-f-test.sh \
|
tests/jq-f-test.sh \
|
||||||
tests/no-main-program.jq tests/yes-main-program.jq
|
tests/no-main-program.jq tests/yes-main-program.jq
|
||||||
|
|
||||||
AM_DISTCHECK_CONFIGURE_FLAGS=--with-oniguruma=builtin
|
AM_DISTCHECK_CONFIGURE_FLAGS=--with-oniguruma=builtin
|
||||||
|
|||||||
+7
-7
@@ -42,17 +42,17 @@ jv jv_load_file(const char* filename, int raw) {
|
|||||||
// To avoid mangling UTF-8 multi-byte sequences that cross the end of our read
|
// To avoid mangling UTF-8 multi-byte sequences that cross the end of our read
|
||||||
// buffer, we need to be able to read the remainder of a sequence and add that
|
// buffer, we need to be able to read the remainder of a sequence and add that
|
||||||
// before appending.
|
// before appending.
|
||||||
const int max_utf8_len = 4;
|
char buf[4096 + 4];
|
||||||
char buf[4096+max_utf8_len];
|
|
||||||
while (!feof(file) && !ferror(file)) {
|
while (!feof(file) && !ferror(file)) {
|
||||||
size_t n = fread(buf, 1, sizeof(buf)-max_utf8_len, file);
|
size_t n = fread(buf, 1, sizeof(buf) - 4, file);
|
||||||
int len = 0;
|
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
continue;
|
continue;
|
||||||
if (jvp_utf8_backtrack(buf+(n-1), buf, &len) && len > 0 &&
|
|
||||||
|
char *end = buf + n;
|
||||||
|
int len = 0;
|
||||||
|
if (jvp_utf8_backtrack(end - 1, buf, &len) && len > 0 &&
|
||||||
!feof(file) && !ferror(file)) {
|
!feof(file) && !ferror(file)) {
|
||||||
n += fread(buf+n, 1, len, file);
|
n += fread(end, 1, len, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (raw) {
|
if (raw) {
|
||||||
|
|||||||
+12
-4
@@ -65,6 +65,7 @@ void *alloca (size_t);
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "jq.h"
|
#include "jq.h"
|
||||||
#include "jv_alloc.h"
|
#include "jv_alloc.h"
|
||||||
|
#include "jv_unicode.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
FILE *fopen(const char *fname, const char *mode) {
|
FILE *fopen(const char *fname, const char *mode) {
|
||||||
@@ -296,7 +297,9 @@ static int jq_util_input_read_more(jq_util_input_state *state) {
|
|||||||
char *res;
|
char *res;
|
||||||
memset(state->buf, 0xff, sizeof(state->buf));
|
memset(state->buf, 0xff, sizeof(state->buf));
|
||||||
|
|
||||||
while (!(res = fgets(state->buf, sizeof(state->buf), state->current_input)) &&
|
const int max_utf8_len = 4;
|
||||||
|
const int max_gets_len = sizeof(state->buf) - max_utf8_len;
|
||||||
|
while (!(res = fgets(state->buf, max_gets_len, state->current_input)) &&
|
||||||
ferror(state->current_input) && errno == EINTR)
|
ferror(state->current_input) && errno == EINTR)
|
||||||
clearerr(state->current_input);
|
clearerr(state->current_input);
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
@@ -304,7 +307,7 @@ static int jq_util_input_read_more(jq_util_input_state *state) {
|
|||||||
if (ferror(state->current_input))
|
if (ferror(state->current_input))
|
||||||
state->failures++;
|
state->failures++;
|
||||||
} else {
|
} else {
|
||||||
const char *p = memchr(state->buf, '\n', sizeof(state->buf));
|
const char *p = memchr(state->buf, '\n', max_gets_len);
|
||||||
|
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
state->current_line++;
|
state->current_line++;
|
||||||
@@ -330,13 +333,18 @@ static int jq_util_input_read_more(jq_util_input_state *state) {
|
|||||||
* terminating '\0'. This only works because we previously memset our
|
* terminating '\0'. This only works because we previously memset our
|
||||||
* buffer with something nonzero.
|
* buffer with something nonzero.
|
||||||
*/
|
*/
|
||||||
for (i = sizeof(state->buf) - 1; i > 0; i--) {
|
for (i = max_gets_len - 1; i > 0; i--) {
|
||||||
if (state->buf[i] == '\0')
|
if (state->buf[i] == '\0')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
state->buf_valid_len = i;
|
state->buf_valid_len = i;
|
||||||
} else if (p == NULL) {
|
} else if (p == NULL) {
|
||||||
state->buf_valid_len = sizeof(state->buf) - 1;
|
state->buf_valid_len = max_gets_len - 1;
|
||||||
|
char *end = state->buf + state->buf_valid_len;
|
||||||
|
int len = 0;
|
||||||
|
if (jvp_utf8_backtrack(end - 1, state->buf, &len) && len > 0) {
|
||||||
|
state->buf_valid_len += fread(end, 1, len, state->current_input);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
state->buf_valid_len = (p - state->buf) + 1;
|
state->buf_valid_len = (p - state->buf) + 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
def fill:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
|
||||||
def e:"日本語";
|
|
||||||
e == "日本語"
|
|
||||||
+19
-5
@@ -1,10 +1,24 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh -x
|
||||||
|
|
||||||
. "${0%/*}/setup" "$@"
|
. "${0%/*}/setup" "$@"
|
||||||
|
|
||||||
if [ "$($VALGRIND $Q $JQ -nf $JQTESTDIR/utf8-truncate.jq)" != "true" ]; then
|
# Reading jq file does not corrupt multi-byte characters -- #1311
|
||||||
echo "UTF-8 byte sequences that span the jv_load_file read buffer are mangled"
|
for l in 1 2 3 4; do
|
||||||
exit 1
|
$VALGRIND $Q $JQ -rn "[(range($l) | 48), (range(3000) | 128515)] | implode |
|
||||||
fi
|
\"\\(tojson) | explode | unique == [48, 128515]\"" > $d/input
|
||||||
|
if ! $VALGRIND $Q $JQ -nef $d/input > /dev/null; then
|
||||||
|
echo "Reading jq file corrupted multi-byte characters"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Slurping raw input does not corrupt multi-byte characters -- #3389
|
||||||
|
for l in 1 2 3 4; do
|
||||||
|
$VALGRIND $Q $JQ -jn "[(range($l) | 48), (range(3000) | 128515)] | implode" > $d/input
|
||||||
|
if ! $VALGRIND $Q $JQ -Rse 'explode | unique == [48, 128515]' $d/input > /dev/null; then
|
||||||
|
echo "Slurping raw input corrupted multi-byte characters"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
Reference in new issue
Block a user