summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@dahyabhai.net>2012-07-23 20:36:07 -0400
committerGreg Hudson <ghudson@mit.edu>2012-10-15 12:02:16 -0400
commit31390cda1de73dc84394e6c826310192b93520be (patch)
treed56b6fae003fbd7a6c7c9b961e82e230daa73163 /src/lib
parentad5aa12f13aad7ec4cafcffeec4f2e84e56c9c78 (diff)
downloadkrb5-31390cda1de73dc84394e6c826310192b93520be.tar.gz
krb5-31390cda1de73dc84394e6c826310192b93520be.tar.xz
krb5-31390cda1de73dc84394e6c826310192b93520be.zip
Use hex escaping for non-printable trace data
When adding {str}, {lenstr}, or {data} to trace output, scan for bytes which might be non-printable, and add them as hex-escaped versions of themselves if any are found.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/os/trace.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/lib/krb5/os/trace.c b/src/lib/krb5/os/trace.c
index f3e1d8954..355b14393 100644
--- a/src/lib/krb5/os/trace.c
+++ b/src/lib/krb5/os/trace.c
@@ -45,6 +45,45 @@
static void subfmt(krb5_context context, struct k5buf *buf,
const char *fmt, ...);
+static krb5_boolean
+buf_is_printable(const char *p, size_t len)
+{
+ size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (p[i] < 32 || p[i] > 126)
+ break;
+ }
+ return i == len;
+}
+
+static void
+buf_add_printable_len(struct k5buf *buf, const char *p, size_t len)
+{
+ char text[5];
+ size_t i;
+
+ if (buf_is_printable(p, len)) {
+ krb5int_buf_add_len(buf, p, len);
+ } else {
+ for (i = 0; i < len; i++) {
+ if (buf_is_printable(p + i, 1)) {
+ krb5int_buf_add_len(buf, p + i, 1);
+ } else {
+ snprintf(text, sizeof(text), "\\x%02x",
+ (unsigned)(p[i] & 0xff));
+ krb5int_buf_add_len(buf, text, 4);
+ }
+ }
+ }
+}
+
+static void
+buf_add_printable(struct k5buf *buf, const char *p)
+{
+ buf_add_printable_len(buf, p, strlen(p));
+}
+
/* Return a four-byte hex string from the first two bytes of a SHA-1 hash of a
* byte array. Return NULL on failure. */
static char *
@@ -128,14 +167,14 @@ trace_format(krb5_context context, const char *fmt, va_list ap)
krb5int_buf_add_fmt(&buf, "%ld", va_arg(ap, long));
} else if (strcmp(tmpbuf, "str") == 0) {
p = va_arg(ap, const char *);
- krb5int_buf_add(&buf, (p == NULL) ? "(null)" : p);
+ buf_add_printable(&buf, (p == NULL) ? "(null)" : p);
} else if (strcmp(tmpbuf, "lenstr") == 0) {
len = va_arg(ap, size_t);
p = va_arg(ap, const char *);
if (p == NULL && len != 0)
krb5int_buf_add(&buf, "(null)");
else
- krb5int_buf_add_len(&buf, p, len);
+ buf_add_printable_len(&buf, p, len);
} else if (strcmp(tmpbuf, "hexlenstr") == 0) {
len = va_arg(ap, size_t);
p = va_arg(ap, const char *);
@@ -179,7 +218,7 @@ trace_format(krb5_context context, const char *fmt, va_list ap)
if (d == NULL || (d->length != 0 && d->data == NULL))
krb5int_buf_add(&buf, "(null)");
else
- krb5int_buf_add_len(&buf, d->data, d->length);
+ buf_add_printable_len(&buf, d->data, d->length);
} else if (strcmp(tmpbuf, "hexdata") == 0) {
d = va_arg(ap, krb5_data *);
if (d == NULL)