bool incomplete;
};
-static void user_group_data_release(struct user_group_data *d) {
+static void user_group_data_done(struct user_group_data *d) {
json_variant_unref(d->record);
}
+struct membership_data {
+ char *user_name;
+ char *group_name;
+};
+
+static void membership_data_done(struct membership_data *d) {
+ free(d->user_name);
+ free(d->group_name);
+}
+
static int userdb_on_query_reply(
Varlink *link,
JsonVariant *parameters,
VarlinkReplyFlags flags,
void *userdata) {
- UserDBIterator *iterator = userdata;
+ UserDBIterator *iterator = ASSERT_PTR(userdata);
int r;
- assert(iterator);
-
if (error_id) {
log_debug("Got lookup error: %s", error_id);
switch (iterator->what) {
case LOOKUP_USER: {
- _cleanup_(user_group_data_release) struct user_group_data user_data = {};
+ _cleanup_(user_group_data_done) struct user_group_data user_data = {};
static const JsonDispatch dispatch_table[] = {
{ "record", _JSON_VARIANT_TYPE_INVALID, json_dispatch_variant, offsetof(struct user_group_data, record), 0 },
assert_se(!iterator->found_user);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &user_data);
+ r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &user_data);
if (r < 0)
goto finish;
}
case LOOKUP_GROUP: {
- _cleanup_(user_group_data_release) struct user_group_data group_data = {};
+ _cleanup_(user_group_data_done) struct user_group_data group_data = {};
static const JsonDispatch dispatch_table[] = {
{ "record", _JSON_VARIANT_TYPE_INVALID, json_dispatch_variant, offsetof(struct user_group_data, record), 0 },
assert_se(!iterator->found_group);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &group_data);
+ r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &group_data);
if (r < 0)
goto finish;
}
case LOOKUP_MEMBERSHIP: {
- struct membership_data {
- const char *user_name;
- const char *group_name;
- } membership_data = {};
+ _cleanup_(membership_data_done) struct membership_data membership_data = {};
static const JsonDispatch dispatch_table[] = {
- { "userName", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(struct membership_data, user_name), JSON_SAFE },
- { "groupName", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(struct membership_data, group_name), JSON_SAFE },
+ { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(struct membership_data, user_name), JSON_RELAX },
+ { "groupName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(struct membership_data, group_name), JSON_RELAX },
{}
};
assert(!iterator->found_user_name);
assert(!iterator->found_group_name);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &membership_data);
+ r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &membership_data);
if (r < 0)
goto finish;
- iterator->found_user_name = mfree(iterator->found_user_name);
- iterator->found_group_name = mfree(iterator->found_group_name);
-
- iterator->found_user_name = strdup(membership_data.user_name);
- if (!iterator->found_user_name) {
- r = -ENOMEM;
- goto finish;
- }
-
- iterator->found_group_name = strdup(membership_data.group_name);
- if (!iterator->found_group_name) {
- r = -ENOMEM;
- goto finish;
- }
-
+ iterator->found_user_name = TAKE_PTR(membership_data.user_name);
+ iterator->found_group_name = TAKE_PTR(membership_data.group_name);
iterator->n_found++;
if (FLAGS_SET(flags, VARLINK_REPLY_CONTINUES))
JsonVariant *query,
UserDBFlags flags) {
- _cleanup_(strv_freep) char **except = NULL, **only = NULL;
- _cleanup_(closedirp) DIR *d = NULL;
+ _cleanup_strv_free_ char **except = NULL, **only = NULL;
+ _cleanup_closedir_ DIR *d = NULL;
const char *e;
int r, ret = 0;
streq(de->d_name, "io.systemd.DynamicUser"))
continue;
- /* Avoid NSS is this is requested. Note that we also skip NSS when we were asked to skip the
+ /* Avoid NSS if this is requested. Note that we also skip NSS when we were asked to skip the
* multiplexer, since in that case it's safer to do NSS in the client side emulation below
* (and when we run as part of systemd-userdbd.service we don't want to talk to ourselves
* anyway). */
/* Note that we might be called from libnss_systemd.so.2 itself, but that should be fine, really. */
- dl = dlopen(ROOTLIBDIR "/libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
+ dl = dlopen(LIBDIR "/libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
if (!dl) {
/* If the file isn't installed, don't complain loudly */
log_debug("Failed to dlopen(libnss_systemd.so.2), ignoring: %s", dlerror());
return 0;
}
- call = (int (*)(bool b)) dlsym(dl, "_nss_systemd_block");
+ log_debug("Loaded '%s' via dlopen()", LIBDIR "/libnss_systemd.so.2");
+
+ call = dlsym(dl, "_nss_systemd_block");
if (!call)
/* If the file is installed but lacks the symbol we expect, things are weird, let's complain */
return log_debug_errno(SYNTHETIC_ERRNO(ELIBBAD),