#define WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED \
"io.systemd.UserDatabase.EnumerationNotSupported"
+#define WB_VL_ERR_CHECK_GOTO(p, l) do { \
+ int rc = (p); \
+ if (rc < 0) { \
+ DBG_ERR("'"#p"' failed: %s\n", varlink_error_string(rc)); \
+ goto l; \
+ }} while (0)
+
NTSTATUS wb_vl_fake_cli_state(VarlinkCall *call,
const char *service,
struct winbindd_cli_state *cli);
"service name",
WB_VL_SERVICE_NAME);
- varlink_object_new(&record);
- varlink_object_set_string(record, "service", service_name);
- varlink_object_set_string(record, "groupName", gr->gr_name);
- varlink_object_set_int(record, "gid", gr->gr_gid);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_new(&record), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ record, "service", service_name), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ record, "groupName", gr->gr_name), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_int(
+ record, "gid", gr->gr_gid), err_free_record);
if (gr->num_gr_mem > 0 && gr_members != NULL) {
- varlink_array_new(&members);
+ WB_VL_ERR_CHECK_GOTO(varlink_array_new(
+ &members), err_free_members);
for ((name = strtok_r(gr_members, ",", &p)), i = 0;
name != NULL;
name = strtok_r(NULL, ",", &p), i++) {
if (i == gr->num_gr_mem) {
break;
}
- varlink_array_append_string(members, name);
+ WB_VL_ERR_CHECK_GOTO(varlink_array_append_string(
+ members, name), err_free_members);
}
- varlink_object_set_array(record, "members", members);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_array(
+ record, "members", members), err_free_members);
}
- varlink_object_new(&out);
- varlink_object_set_object(out, "record", record);
- varlink_object_set_bool(out, "incomplete", false);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_new(&out), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_bool(
+ out, "incomplete", false), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_object(
+ out, "record", record), err_free_out);
varlink_call_reply(call, out, continues ? VARLINK_REPLY_CONTINUES : 0);
varlink_object_unref(out);
+ return;
+
+err_free_members:
+ if (members != NULL) {
+ varlink_array_unref(members);
+ }
+err_free_out:
+ if (out != NULL) {
+ varlink_object_unref(out);
+ }
+err_free_record:
+ if (record != NULL) {
+ varlink_object_unref(record);
+ }
}
/******************************************************************************
{
VarlinkObject *out = NULL;
- varlink_object_new(&out);
- varlink_object_set_string(out, "userName", username);
- varlink_object_set_string(out, "groupName", groupname);
-
+ WB_VL_ERR_CHECK_GOTO(varlink_object_new(&out), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ out, "userName", username), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ out, "groupName", groupname), err_free_out);
varlink_call_reply(call, out, continues ? VARLINK_REPLY_CONTINUES : 0);
- varlink_object_unref(out);
+
+err_free_out:
+ if (out != NULL) {
+ varlink_object_unref(out);
+ }
}
static void member_list_reply(VarlinkCall *call,
"service name",
WB_VL_SERVICE_NAME);
- varlink_object_new(&record);
- varlink_object_set_string(record, "service", service_name);
- varlink_object_set_string(record, "userName", pw->pw_name);
- varlink_object_set_int(record, "uid", pw->pw_uid);
- varlink_object_set_int(record, "gid", pw->pw_gid);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_new(&record), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(record, "service", service_name), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(record, "userName", pw->pw_name), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_int(record, "uid", pw->pw_uid), err_free_record);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_int(record, "gid", pw->pw_gid), err_free_record);
if (strlen(pw->pw_dir) > 0) {
- varlink_object_set_string(record, "homeDirectory", pw->pw_dir);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ record, "homeDirectory", pw->pw_dir), err_free_record);
}
if (strlen(pw->pw_shell) > 0) {
- varlink_object_set_string(record, "shell", pw->pw_shell);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ record, "shell", pw->pw_shell), err_free_record);
}
if (strlen(pw->pw_gecos) > 0) {
- varlink_object_set_string(record, "realName", pw->pw_gecos);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_string(
+ record, "realName", pw->pw_gecos), err_free_record);
}
- varlink_object_new(&out);
- varlink_object_set_object(out, "record", record);
- varlink_object_set_bool(out, "incomplete", false);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_new(&out), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_bool(out, "incomplete", false), err_free_out);
+ WB_VL_ERR_CHECK_GOTO(varlink_object_set_object(out, "record", record), err_free_out);
varlink_call_reply(call, out, continues ? VARLINK_REPLY_CONTINUES : 0);
varlink_object_unref(out);
+ return;
+err_free_out:
+ if (out != NULL) {
+ varlink_object_unref(out);
+ }
+err_free_record:
+ if (record != NULL) {
+ varlink_object_unref(record);
+ }
}
/******************************************************************************