diff options
author | Alex Richardson <arichardson@FreeBSD.org> | 2020-11-04 14:31:52 +0000 |
---|---|---|
committer | Alex Richardson <arichardson@FreeBSD.org> | 2020-11-04 14:31:52 +0000 |
commit | d24f17df969107b47af60e5ccc1ed0f1a467fc6f (patch) | |
tree | 76ed6f43d5e16ce1eeac112c9a4745087836660b /usr.sbin/jls | |
parent | 4c18532bd0e1d70853f864abf0a03cec3ea8d288 (diff) |
Fix bad libbxo format strings in jls
The existing format string for the empty case was trying to read varargs
values that weren't passed to xo_emit. This appears to work on x86 (since
the next argument is probably a pointer an empty string), but for CHERI
we can bound variadic arguments and detect a read past the end.
While touching these lines also use the libxo 'a' modifier to avoid having to
construct the libxo format string using asprintf.
Found by: CHERI
Reviewed By: allanjude
Differential Revision: https://reviews.freebsd.org/D26885
Notes
Notes:
svn path=/head/; revision=367331
Diffstat (limited to 'usr.sbin/jls')
-rw-r--r-- | usr.sbin/jls/jls.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/usr.sbin/jls/jls.c b/usr.sbin/jls/jls.c index 4c968fdc76df..3621de849bda 100644 --- a/usr.sbin/jls/jls.c +++ b/usr.sbin/jls/jls.c @@ -505,17 +505,13 @@ quoted_print(int pflags, char *name, char *value) { int qc; char *p = value; - char *param_name_value; /* An empty string needs quoting. */ if (!*p) { - asprintf(¶m_name_value, "{k:%s}{d:%s/\"\"}", name, name); - xo_emit(param_name_value); - free(param_name_value); + xo_emit("{ea:/%s}{da:/\"\"}", name, value, name); return; } - asprintf(¶m_name_value, "{:%s/%%s}", name); /* * The value will be surrounded by quotes if it contains spaces * or quotes. @@ -528,9 +524,7 @@ quoted_print(int pflags, char *name, char *value) if (qc && pflags & PRINT_QUOTED) xo_emit("{P:/%c}", qc); - xo_emit(param_name_value, value); - - free(param_name_value); + xo_emit("{a:/%s}", name, value); if (qc && pflags & PRINT_QUOTED) xo_emit("{P:/%c}", qc); |