diff --git a/src/tools/pw-reserve.c b/src/tools/pw-reserve.c index 2b3136452..180afa446 100644 --- a/src/tools/pw-reserve.c +++ b/src/tools/pw-reserve.c @@ -142,8 +142,8 @@ int main(int argc, char *argv[]) return -1; } } - if (opt_name == NULL) { - fprintf(stderr, "name must be given\n"); + if (opt_name == NULL || !rd_device_valid_device_name(opt_name)) { + fprintf(stderr, "valid name must be given\n"); return -1; } @@ -190,6 +190,11 @@ int main(int argc, char *argv[]) opt_appname, opt_priority, &reserve_callbacks, &impl); + if (!impl.device) { + res = -errno; + fprintf(stderr, "dbus connection failed: %m\n"); + goto exit; + } if (!opt_monitor) { res = rd_device_acquire(impl.device); diff --git a/src/tools/reserve.c b/src/tools/reserve.c index 47733548f..5a6a840a3 100644 --- a/src/tools/reserve.c +++ b/src/tools/reserve.c @@ -307,6 +307,34 @@ invalid: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } +bool rd_device_valid_device_name(const char *name) +{ + const char *p = name; + + if (!p || !*p) + return false; + + /* cf. dbus-marshal-validate.c:_dbus_validate_bus_name_full */ + while (*p) { + switch (*p) { + case 'A' ... 'Z': + case 'a' ... 'z': + case '-': + case '_': + break; + case '0' ... '9': + if (p == name) + return false; + break; + default: + return false; + } + ++p; + } + + return true; +} + struct rd_device * rd_device_new(DBusConnection *connection, const char *device_name, const char *application_name, int32_t priority, const struct rd_device_callbacks *callbacks, void *data) @@ -314,6 +342,11 @@ rd_device_new(DBusConnection *connection, const char *device_name, const char *a struct rd_device *d; int res; + if (!rd_device_valid_device_name(device_name)) { + errno = EINVAL; + return NULL; + } + d = calloc(1, sizeof(struct rd_device)); if (d == NULL) return NULL; diff --git a/src/tools/reserve.h b/src/tools/reserve.h index 6be3d1177..36f8de9ef 100644 --- a/src/tools/reserve.h +++ b/src/tools/reserve.h @@ -7,6 +7,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -51,6 +52,9 @@ void rd_device_release(struct rd_device *d); /** destroy a device */ void rd_device_destroy(struct rd_device *d); +/** check if device name is a valid name */ +bool rd_device_valid_device_name(const char *name); + /* Set the application device name for an rd_device object. Returns 0 * on success, a negative errno style return value on error. */ int rd_device_set_application_device_name(struct rd_device *d, const char *name);