diff options
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r-- | dbus/dbus-sysdeps.c | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index f706d08a..0877a293 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -1315,7 +1315,8 @@ static dbus_bool_t store_user_info (struct passwd *p, DBusCredentials *credentials, DBusString *homedir, - DBusString *username_out) + DBusString *username_out, + DBusError *error) { int old_homedir_len; @@ -1332,7 +1333,7 @@ store_user_info (struct passwd *p, if (!_dbus_string_append (homedir, p->pw_dir)) { - _dbus_verbose ("No memory to get homedir\n"); + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); return FALSE; } } @@ -1342,7 +1343,7 @@ store_user_info (struct passwd *p, { if (homedir) _dbus_string_set_length (homedir, old_homedir_len); - _dbus_verbose ("No memory to get username\n"); + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); return FALSE; } @@ -1363,6 +1364,7 @@ store_user_info (struct passwd *p, * @param credentials to fill in or #NULL * @param homedir string to append homedir to or #NULL * @param username_out string to append username to or #NULL + * @param error return location for reason for failure * * @returns #TRUE on success */ @@ -1371,7 +1373,8 @@ get_user_info (const DBusString *username, dbus_uid_t uid, DBusCredentials *credentials, DBusString *homedir, - DBusString *username_out) + DBusString *username_out, + DBusError *error) { const char *username_c_str; @@ -1417,10 +1420,13 @@ get_user_info (const DBusString *username, if (result == 0 && p == &p_str) { return store_user_info (p, credentials, homedir, - username_out); + username_out, error); } else { + dbus_set_error (error, DBUS_ERROR_FAILED, + "User \"%s\" unknown or no memory to allocate password entry\n", + username_c_str); _dbus_verbose ("User %s unknown\n", username_c_str); return FALSE; } @@ -1438,10 +1444,13 @@ get_user_info (const DBusString *username, if (p != NULL) { return store_user_info (p, credentials, homedir, - username_out); + username_out, error); } else { + dbus_set_error (error, DBUS_ERROR_FAILED, + "User \"%s\" unknown or no memory to allocate password entry\n", + username_c_str); _dbus_verbose ("User %s unknown\n", username_c_str); return FALSE; } @@ -1474,7 +1483,7 @@ dbus_bool_t _dbus_credentials_from_username (const DBusString *username, DBusCredentials *credentials) { - return get_user_info (username, -1, credentials, NULL, NULL); + return get_user_info (username, -1, credentials, NULL, NULL, NULL); } /** @@ -1512,7 +1521,7 @@ dbus_bool_t _dbus_credentials_from_user_id (unsigned long user_id, DBusCredentials *credentials) { - return get_user_info (NULL, user_id, credentials, NULL, NULL); + return get_user_info (NULL, user_id, credentials, NULL, NULL, NULL); } _DBUS_DEFINE_GLOBAL_LOCK (user_info); @@ -1570,7 +1579,7 @@ _dbus_user_info_from_current_process (const DBusString **username, _dbus_credentials_clear (&u.creds); if (!get_user_info (NULL, getuid (), - &u.creds, &u.dir, &u.name)) + &u.creds, &u.dir, &u.name, NULL)) goto fail_init; if (!_dbus_register_shutdown_func (shutdown_user_info, @@ -1611,7 +1620,7 @@ dbus_bool_t _dbus_homedir_from_username (const DBusString *username, DBusString *homedir) { - return get_user_info (username, -1, NULL, homedir, NULL); + return get_user_info (username, -1, NULL, homedir, NULL, NULL); } /** @@ -1773,21 +1782,20 @@ _dbus_get_group_id (const DBusString *group_name, /** * Gets all groups for a particular user. Returns #FALSE * if no memory, or user isn't known, but always initializes - * group_ids to a NULL array. - * - * @todo failing to distinguish "out of memory" from - * "unknown user" is kind of bogus and would probably - * result in a failure in a comprehensive test suite. + * group_ids to a NULL array. Sets error to the reason + * for returning #FALSE. * * @param uid the user ID * @param group_ids return location for array of group IDs * @param n_group_ids return location for length of returned array + * @param error return location for error * @returns #TRUE on success */ dbus_bool_t _dbus_get_groups (unsigned long uid, unsigned long **group_ids, - int *n_group_ids) + int *n_group_ids, + DBusError *error) { DBusCredentials creds; DBusString username; @@ -1800,10 +1808,13 @@ _dbus_get_groups (unsigned long uid, retval = FALSE; if (!_dbus_string_init (&username)) - return FALSE; + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + return FALSE; + } if (!get_user_info (NULL, uid, &creds, - NULL, &username) || + NULL, &username, error) || creds.gid == DBUS_GID_UNSET) goto out; @@ -1818,7 +1829,10 @@ _dbus_get_groups (unsigned long uid, buf_count = 17; buf = dbus_new (gid_t, buf_count); if (buf == NULL) - goto out; + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + goto out; + } if (getgrouplist (username_c, creds.gid, @@ -1827,6 +1841,7 @@ _dbus_get_groups (unsigned long uid, gid_t *new = dbus_realloc (buf, buf_count * sizeof (buf[0])); if (new == NULL) { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); dbus_free (buf); goto out; } @@ -1839,6 +1854,7 @@ _dbus_get_groups (unsigned long uid, *group_ids = dbus_new (unsigned long, buf_count); if (*group_ids == NULL) { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); dbus_free (buf); goto out; } @@ -1855,19 +1871,28 @@ _dbus_get_groups (unsigned long uid, /* We just get the one group ID */ *group_ids = dbus_new (unsigned long, 1); if (*group_ids == NULL) - goto out; + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + goto out; + } *n_group_ids = 1; (*group_ids)[0] = creds.gid; } #endif /* HAVE_GETGROUPLIST */ + + retval = TRUE; + + out: + _dbus_string_free (&username); - retval = TRUE; - - out: - _dbus_string_free (&username); - return retval; + if (retval) + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + else + _DBUS_ASSERT_ERROR_IS_SET (error); + + return retval; } /** |