diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2015-11-06 20:54:13 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-11-14 13:33:43 +0100 |
commit | 6b01dae732eedee808f32a9cdd4b5656a9f839c4 (patch) | |
tree | 0ea3a2cfd099b4ce2e2e0c9f48148f72681d9d2d /src/sbus | |
parent | e8ae3af6724164048a85c374ea8045a368a2d34e (diff) | |
download | sssd-6b01dae732eedee808f32a9cdd4b5656a9f839c4.tar.gz sssd-6b01dae732eedee808f32a9cdd4b5656a9f839c4.tar.xz sssd-6b01dae732eedee808f32a9cdd4b5656a9f839c4.zip |
sbus: Check string arguments for valid UTF-8 strings
libdbus abort()s when a string argument is not valid UTF-8. Since the
arguments sometimes come from untrusted sources, it's better to check
the string validity explicitly.
Reviewed-by: Sumit Bose <sbose@redhat.com>
Diffstat (limited to 'src/sbus')
-rw-r--r-- | src/sbus/sssd_dbus_request.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/sbus/sssd_dbus_request.c b/src/sbus/sssd_dbus_request.c index 552bb5da8..db0a23fb7 100644 --- a/src/sbus/sssd_dbus_request.c +++ b/src/sbus/sssd_dbus_request.c @@ -19,6 +19,7 @@ */ #include "util/util.h" +#include "util/sss_utf8.h" #include "sbus/sssd_dbus.h" #include "sbus/sssd_dbus_private.h" @@ -96,23 +97,66 @@ int sbus_request_finish(struct sbus_request *dbus_req, return talloc_free(dbus_req); } +static int sbus_request_valist_check(va_list va, int first_arg_type) +{ + int ret = EOK; +#ifdef HAVE_DBUSBASICVALUE + int type; + va_list va_check; + const DBusBasicValue *value; + bool ok; + + va_copy(va_check, va); + + type = first_arg_type; + while (type != DBUS_TYPE_INVALID) { + value = va_arg(va_check, const DBusBasicValue*); + + if (type == DBUS_TYPE_STRING) { + ok = sss_utf8_check((const uint8_t *) value->str, + strlen(value->str)); + if (!ok) { + DEBUG(SSSDBG_MINOR_FAILURE, + "sbus message argument [%s] contains invalid " \ + "non-UTF8 characters", value->str); + ret = EINVAL; + break; + } + } + type = va_arg(va_check, int); + } + + va_end(va_check); +#endif /* HAVE_DBUSBASICVALUE */ + return ret; +} + int sbus_request_return_and_finish(struct sbus_request *dbus_req, int first_arg_type, ...) { DBusMessage *reply; + DBusError error = DBUS_ERROR_INIT; dbus_bool_t dbret; va_list va; int ret; + va_start(va, first_arg_type); + ret = sbus_request_valist_check(va, first_arg_type); + if (ret != EOK) { + va_end(va); + dbus_set_error_const(&error, DBUS_ERROR_INVALID_ARGS, INTERNAL_ERROR); + return sbus_request_fail_and_finish(dbus_req, &error); + } + reply = dbus_message_new_method_return(dbus_req->message); if (!reply) { + va_end(va); DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory allocating DBus message\n"); sbus_request_finish(dbus_req, NULL); return ENOMEM; } - va_start(va, first_arg_type); dbret = dbus_message_append_args_valist(reply, first_arg_type, va); va_end(va); |