diff options
| author | NIIBE Yutaka <[email protected]> | 2026-05-21 07:59:44 +0200 |
|---|---|---|
| committer | NIIBE Yutaka <[email protected]> | 2026-05-21 07:59:44 +0200 |
| commit | 95d7cdb6b4309ef77f875edaf09a9632268ea1d3 (patch) | |
| tree | cd95d139c17d021015a4f5415a0480ffaba49bec | |
| parent | m4: Deprecate AM_PATH_GPGME_GLIB macro. (diff) | |
| download | gpgme-95d7cdb6b4309ef77f875edaf09a9632268ea1d3.tar.gz gpgme-95d7cdb6b4309ef77f875edaf09a9632268ea1d3.zip | |
json:w32: Add CRLF handling for armored output.
* src/json-core.c (make_data_object): Remove CR for CRLF when
it's armored output.
--
GnuPG-bug-id: 8263
Signed-off-by: NIIBE Yutaka <[email protected]>
| -rw-r--r-- | src/json-core.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/src/json-core.c b/src/json-core.c index 4657b616..f04d062b 100644 --- a/src/json-core.c +++ b/src/json-core.c @@ -1195,6 +1195,9 @@ make_data_object (cjson_t result, gpgme_data_t data, char *buffer; const char *s; size_t buflen, n; +#ifdef HAVE_W32_SYSTEM + int armor_enabled = 0; +#endif if (!base64 || base64 == -1) /* Make sure that we really have a string. */ gpgme_data_write (data, "", 1); @@ -1225,6 +1228,10 @@ make_data_object (cjson_t result, gpgme_data_t data, break; } } +#ifdef HAVE_W32_SYSTEM + else + armor_enabled = !base64; +#endif xjson_AddStringToObject (result, "type", type); xjson_AddBoolToObject (result, "base64", base64); @@ -1232,7 +1239,52 @@ make_data_object (cjson_t result, gpgme_data_t data, if (base64) err = add_base64_to_object (result, "data", buffer, buflen); else - err = cjson_AddStringToObject (result, "data", buffer); + { +#ifdef HAVE_W32_SYSTEM + /* + * In armored output on Windows, newline is CRLF. We need to + * convert CRLF into LF so that the JSON representation is + * always same. + */ + if (armor_enabled) + { + char *p, *p_write; + const char *p_end = buffer + buflen; + + p = p_write = buffer; + + while (1) + { + char c0, c1; + + c0 = *p++; + if (p >= p_end) + { + *p_write++ = c0; + break; + } + + if (c0 != '\r') + { + *p_write++ = c0; + continue; + } + + c1 = *p++; + if (c1 == '\n') + *p_write++ = c1; + else + { + *p_write++ = c0; + *p_write++ = c1; + } + if (p >= p_end) + break; + } + } +#endif + err = cjson_AddStringToObject (result, "data", buffer); + } leave: gpgme_free (buffer); |
