summaryrefslogtreecommitdiff
path: root/src/basic/hexdecoct.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-04-17 18:29:23 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-04-17 18:29:42 +0200
commit0136b1d1e091809065cfa5c9824664cacfdb5655 (patch)
treed6b86e9e3f8083d23e9bb1d80326884de56d3c39 /src/basic/hexdecoct.c
parent2cb9a8b96354c59a6ae93df57b358c00962bef61 (diff)
downloadsystemd-0136b1d1e091809065cfa5c9824664cacfdb5655.tar.gz
resolvectl: fix indentation of hexdump'ed packets
ebf963c551e1077abaa5e0fa0f330e6d1c23565e changed the 'sep' argument to always be either " " or "\n", which broke the indentation logic for the first line in base64_append_width(). Since it now always is one character, and never NULL, let's change the type to char and simplify the logic a bit. $ COLUMNS=30 build/test-dns-packet test/test-resolve/org~20200417.pkts ============== test/test-resolve/org~20200417.pkts ============== org IN DNSKEY 256 3 RSASHA1-NSEC3-SHA1 AwEAAcLPVEcg0hFBheXQf QOqqLiRgckk69o2KTAsq3 lNRY0c9mnEjzZDGsGmXNy 2EQ6yelkIYYus7KLor2Fz x59hEqcM82zqkdHV6hXvZ yjxxSHG3nl8xQS6gF8mdI YouDTWWhTInfjSKoIeDok Hq3S67EjSngV7/wVCMTbI amS0NF4H -- Flags: ZONE_KEY -- Key tag: 37022 ... $ COLUMNS=120 build/test-dns-packet test/test-resolve/org~20200417.pkts ============== test/test-resolve/org~20200417.pkts ============== org IN DNSKEY 256 3 RSASHA1-NSEC3-SHA1 AwEAAcLPVEcg0hFBheXQfQOqqLiRgckk69o2KTAsq3lNRY0c9mnEjzZDGsGmXNy2EQ6yelkIYYus7KLor 2Fzx59hEqcM82zqkdHV6hXvZyjxxSHG3nl8xQS6gF8mdIYouDTWWhTInfjSKoIeDokHq3S67EjSngV7/w VCMTbIamS0NF4H -- Flags: ZONE_KEY -- Key tag: 37022 ...
Diffstat (limited to 'src/basic/hexdecoct.c')
-rw-r--r--src/basic/hexdecoct.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/basic/hexdecoct.c b/src/basic/hexdecoct.c
index 5e425b0231..96f7b9ed0f 100644
--- a/src/basic/hexdecoct.c
+++ b/src/basic/hexdecoct.c
@@ -599,13 +599,13 @@ ssize_t base64mem(const void *p, size_t l, char **out) {
static int base64_append_width(
char **prefix, int plen,
- const char *sep, int indent,
+ char sep, int indent,
const void *p, size_t l,
int width) {
_cleanup_free_ char *x = NULL;
char *t, *s;
- ssize_t len, slen, avail, line, lines;
+ ssize_t len, avail, line, lines;
len = base64mem(p, l, &x);
if (len <= 0)
@@ -613,21 +613,20 @@ static int base64_append_width(
lines = DIV_ROUND_UP(len, width);
- slen = strlen_ptr(sep);
- if (plen >= SSIZE_MAX - 1 - slen ||
- lines > (SSIZE_MAX - plen - 1 - slen) / (indent + width + 1))
+ if ((size_t) plen >= SSIZE_MAX - 1 - 1 ||
+ lines > (SSIZE_MAX - plen - 1 - 1) / (indent + width + 1))
return -ENOMEM;
- t = realloc(*prefix, (ssize_t) plen + 1 + slen + (indent + width + 1) * lines);
+ t = realloc(*prefix, (ssize_t) plen + 1 + 1 + (indent + width + 1) * lines);
if (!t)
return -ENOMEM;
- memcpy_safe(t + plen, sep, slen);
+ t[plen] = sep;
- for (line = 0, s = t + plen + slen, avail = len; line < lines; line++) {
+ for (line = 0, s = t + plen + 1, avail = len; line < lines; line++) {
int act = MIN(width, avail);
- if (line > 0 || sep) {
+ if (line > 0 || sep == '\n') {
memset(s, ' ', indent);
s += indent;
}
@@ -650,10 +649,10 @@ int base64_append(
if (plen > width / 2 || plen + indent > width)
/* leave indent on the left, keep last column free */
- return base64_append_width(prefix, plen, "\n", indent, p, l, width - indent - 1);
+ return base64_append_width(prefix, plen, '\n', indent, p, l, width - indent - 1);
else
/* leave plen on the left, keep last column free */
- return base64_append_width(prefix, plen, " ", plen, p, l, width - plen - 1);
+ return base64_append_width(prefix, plen, ' ', plen + 1, p, l, width - plen - 1);
}
static int unbase64_next(const char **p, size_t *l) {