diff options
author | Don Anderson <dda@mongodb.com> | 2016-06-03 15:52:46 -0400 |
---|---|---|
committer | Keith Bostic <keith.bostic@mongodb.com> | 2016-06-03 15:52:46 -0400 |
commit | 7d5c484b3c422ba26f57f5c93a2cff275fad963d (patch) | |
tree | bedc34e3f84f150bd19b72cf1fa706d37600d50f | |
parent | e6b58318951409ef05599e1fd4dcac32af4ee071 (diff) | |
download | mongo-7d5c484b3c422ba26f57f5c93a2cff275fad963d.tar.gz |
WT-2677 Fix JSON output so only printable ASCII is produced. (#2771)
* WT-2677 Fix JSON output so only printable ASCII is produced.
The root cause is a sign extension error that shows up on systems
that have a signed 'char'.
* WT-2677 Fix compile warnings for sign conversions
* Include changes to auto-generated files.
-rw-r--r-- | dist/log.py | 2 | ||||
-rw-r--r-- | src/cursor/cur_json.c | 14 | ||||
-rw-r--r-- | src/include/extern.h | 2 | ||||
-rw-r--r-- | src/log/log_auto.c | 2 | ||||
-rw-r--r-- | src/utilities/util_dump.c | 5 |
5 files changed, 13 insertions, 12 deletions
diff --git a/dist/log.py b/dist/log.py index 9201b20054b..8743dd3a71c 100644 --- a/dist/log.py +++ b/dist/log.py @@ -178,7 +178,7 @@ __wt_logop_read(WT_SESSION_IMPL *session, } static size_t -__logrec_json_unpack_str(char *dest, size_t destlen, const char *src, +__logrec_json_unpack_str(char *dest, size_t destlen, const u_char *src, size_t srclen) { \tsize_t total; diff --git a/src/cursor/cur_json.c b/src/cursor/cur_json.c index 133b7b9ac9b..cec79306bce 100644 --- a/src/cursor/cur_json.c +++ b/src/cursor/cur_json.c @@ -66,7 +66,7 @@ __json_unpack_put(WT_SESSION_IMPL *session, void *voidpv, u_char *buf, size_t bufsz, WT_CONFIG_ITEM *name) { WT_PACK_VALUE *pv; - const char *p, *end; + const u_char *p, *end; size_t s, n; pv = (WT_PACK_VALUE *)voidpv; @@ -86,7 +86,7 @@ __json_unpack_put(WT_SESSION_IMPL *session, void *voidpv, case 'S': /* Account for '"' quote in front and back. */ s += 2; - p = (const char *)pv->u.s; + p = (const u_char *)pv->u.s; if (bufsz > 0) { *buf++ = '"'; bufsz--; @@ -122,7 +122,7 @@ __json_unpack_put(WT_SESSION_IMPL *session, void *voidpv, case 'U': case 'u': s += 2; - p = (const char *)pv->u.item.data; + p = (const u_char *)pv->u.item.data; end = p + pv->u.item.size; if (bufsz > 0) { *buf++ = '"'; @@ -314,14 +314,14 @@ __wt_json_close(WT_SESSION_IMPL *session, WT_CURSOR *cursor) * Can be called with null buf for sizing. */ size_t -__wt_json_unpack_char(char ch, u_char *buf, size_t bufsz, bool force_unicode) +__wt_json_unpack_char(u_char ch, u_char *buf, size_t bufsz, bool force_unicode) { - char abbrev; + u_char abbrev; if (!force_unicode) { if (isprint(ch) && ch != '\\' && ch != '"') { if (bufsz >= 1) - *buf = (u_char)ch; + *buf = ch; return (1); } else { abbrev = '\0'; @@ -346,7 +346,7 @@ __wt_json_unpack_char(char ch, u_char *buf, size_t bufsz, bool force_unicode) if (abbrev != '\0') { if (bufsz >= 2) { *buf++ = '\\'; - *buf = (u_char)abbrev; + *buf = abbrev; } return (2); } diff --git a/src/include/extern.h b/src/include/extern.h index 4ca5c8461a0..34751bfde6c 100644 --- a/src/include/extern.h +++ b/src/include/extern.h @@ -291,7 +291,7 @@ extern int __wt_curjoin_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSO extern int __wt_curjoin_join(WT_SESSION_IMPL *session, WT_CURSOR_JOIN *cjoin, WT_INDEX *idx, WT_CURSOR *ref_cursor, uint8_t flags, uint8_t range, uint64_t count, uint32_t bloom_bit_count, uint32_t bloom_hash_count); extern int __wt_json_alloc_unpack(WT_SESSION_IMPL *session, const void *buffer, size_t size, const char *fmt, WT_CURSOR_JSON *json, bool iskey, va_list ap); extern void __wt_json_close(WT_SESSION_IMPL *session, WT_CURSOR *cursor); -extern size_t __wt_json_unpack_char(char ch, u_char *buf, size_t bufsz, bool force_unicode); +extern size_t __wt_json_unpack_char(u_char ch, u_char *buf, size_t bufsz, bool force_unicode); extern int __wt_json_column_init(WT_CURSOR *cursor, const char *keyformat, const WT_CONFIG_ITEM *idxconf, const WT_CONFIG_ITEM *colconf); extern int __wt_json_token(WT_SESSION *wt_session, const char *src, int *toktype, const char **tokstart, size_t *toklen); extern const char *__wt_json_tokname(int toktype); diff --git a/src/log/log_auto.c b/src/log/log_auto.c index d4dab4e1a33..34bccd0ede4 100644 --- a/src/log/log_auto.c +++ b/src/log/log_auto.c @@ -44,7 +44,7 @@ __wt_logop_read(WT_SESSION_IMPL *session, } static size_t -__logrec_json_unpack_str(char *dest, size_t destlen, const char *src, +__logrec_json_unpack_str(char *dest, size_t destlen, const u_char *src, size_t srclen) { size_t total; diff --git a/src/utilities/util_dump.c b/src/utilities/util_dump.c index 3314b5ba485..da70aea35be 100644 --- a/src/utilities/util_dump.c +++ b/src/utilities/util_dump.c @@ -552,14 +552,15 @@ dup_json_string(const char *str, char **result) nchars = 0; for (p = str; *p; p++, nchars++) - nchars += __wt_json_unpack_char(*p, NULL, 0, false); + nchars += __wt_json_unpack_char((u_char)*p, NULL, 0, false); q = malloc(nchars + 1); if (q == NULL) return (1); *result = q; left = nchars; for (p = str; *p; p++, nchars++) { - nchars = __wt_json_unpack_char(*p, (u_char *)q, left, false); + nchars = __wt_json_unpack_char((u_char)*p, (u_char *)q, left, + false); left -= nchars; q += nchars; } |