chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
4d9ced9
)
journald: properly decode audit's proctitle= field
author
Lennart Poettering
<lennart@poettering.net>
Mon, 3 Nov 2014 23:27:26 +0000
(
00:27
+0100)
committer
Lennart Poettering
<lennart@poettering.net>
Mon, 3 Nov 2014 23:27:26 +0000
(
00:27
+0100)
src/journal/journald-audit.c
patch
|
blob
|
history
diff --git
a/src/journal/journald-audit.c
b/src/journal/journald-audit.c
index 0e1e8bd5d07ea6bb939552b2c56f3d0c6fba48a1..d88d67c5bd9af25a14a31818f6bc7fd754e279b9 100644
(file)
--- a/
src/journal/journald-audit.c
+++ b/
src/journal/journald-audit.c
@@
-67,7
+67,7
@@
static int map_simple_field(const char *field, const char **p, struct iovec **io
return 1;
}
return 1;
}
-static int map_string_field
(const char *field, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov
) {
+static int map_string_field
_internal(const char *field, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov, bool filter_printable
) {
_cleanup_free_ char *c = NULL;
const char *s, *e;
size_t l;
_cleanup_free_ char *c = NULL;
const char *s, *e;
size_t l;
@@
-108,6
+108,7
@@
static int map_string_field(const char *field, const char **p, struct iovec **io
memcpy(c, field, l);
for (e = *p; *e != ' ' && *e != 0; e += 2) {
int a, b;
memcpy(c, field, l);
for (e = *p; *e != ' ' && *e != 0; e += 2) {
int a, b;
+ uint8_t x;
a = unhexchar(e[0]);
if (a < 0)
a = unhexchar(e[0]);
if (a < 0)
@@
-117,10
+118,15
@@
static int map_string_field(const char *field, const char **p, struct iovec **io
if (b < 0)
return 0;
if (b < 0)
return 0;
+ x = ((uint8_t) a << 4 | (uint8_t) b);
+
+ if (filter_printable && x < (uint8_t) ' ')
+ x = (uint8_t) ' ';
+
if (!GREEDY_REALLOC(c, allocated, l+2))
return -ENOMEM;
if (!GREEDY_REALLOC(c, allocated, l+2))
return -ENOMEM;
- c[l++] = (char)
((uint8_t) a << 4 | (uint8_t) b)
;
+ c[l++] = (char)
x
;
}
c[l] = 0;
}
c[l] = 0;
@@
-140,6
+146,14
@@
static int map_string_field(const char *field, const char **p, struct iovec **io
return 1;
}
return 1;
}
+static int map_string_field(const char *field, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov) {
+ return map_string_field_internal(field, p, iov, n_iov_allocated, n_iov, false);
+}
+
+static int map_string_field_printable(const char *field, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov) {
+ return map_string_field_internal(field, p, iov, n_iov_allocated, n_iov, true);
+}
+
static int map_generic_field(const char *prefix, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov) {
const char *e, *f;
char *c, *t;
static int map_generic_field(const char *prefix, const char **p, struct iovec **iov, size_t *n_iov_allocated, unsigned *n_iov) {
const char *e, *f;
char *c, *t;
@@
-204,7
+218,7
@@
static const MapField map_fields_kernel[] = {
{ "subj=", "_SELINUX_CONTEXT=", map_simple_field },
{ "comm=", "_COMM=", map_string_field },
{ "exe=", "_EXE=", map_string_field },
{ "subj=", "_SELINUX_CONTEXT=", map_simple_field },
{ "comm=", "_COMM=", map_string_field },
{ "exe=", "_EXE=", map_string_field },
- { "proctitle=", "_CMDLINE=", map_string_field },
+ { "proctitle=", "_CMDLINE=", map_string_field
_printable
},
/* Some fields don't map to native well-known fields. However,
* we know that they are string fields, hence let's undo
/* Some fields don't map to native well-known fields. However,
* we know that they are string fields, hence let's undo