]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
_dbus_credentials_add_from_user: Add proper error reporting
authorSimon McVittie <smcv@collabora.com>
Fri, 12 Jan 2018 16:06:22 +0000 (16:06 +0000)
committerSimon McVittie <smcv@collabora.com>
Mon, 15 Jan 2018 14:04:30 +0000 (14:04 +0000)
While I'm changing its signature anyway, I might as well fix a
long-standing FIXME.

Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=104588

dbus/dbus-auth.c
dbus/dbus-sysdeps-win.c
dbus/dbus-sysdeps.h
dbus/dbus-userdb.c

index 37d8d4c96bc18a1c77f1f38ca6ec71ea523f5758..06de633aab97b16c7c39c92201ff0ffa0aab4801 100644 (file)
@@ -549,10 +549,18 @@ sha1_handle_first_client_response (DBusAuth         *auth,
         }
     }
       
-  if (!_dbus_credentials_add_from_user (auth->desired_identity, data))
+  if (!_dbus_credentials_add_from_user (auth->desired_identity, data,
+                                        &error))
     {
-      _dbus_verbose ("%s: Did not get a valid username from client\n",
-                     DBUS_AUTH_NAME (auth));
+      if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
+        {
+          dbus_error_free (&error);
+          goto out;
+        }
+
+      _dbus_verbose ("%s: Did not get a valid username from client: %s\n",
+                     DBUS_AUTH_NAME (auth), error.message);
+      dbus_error_free (&error);
       return send_rejected (auth);
     }
       
@@ -1108,11 +1116,21 @@ handle_server_data_external_mech (DBusAuth         *auth,
     }
   else
     {
+      DBusError error = DBUS_ERROR_INIT;
+
       if (!_dbus_credentials_add_from_user (auth->desired_identity,
-                                            &auth->identity))
+                                            &auth->identity,
+                                            &error))
         {
-          _dbus_verbose ("%s: could not get credentials from uid string\n",
-                         DBUS_AUTH_NAME (auth));
+          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
+            {
+              dbus_error_free (&error);
+              return FALSE;
+            }
+
+          _dbus_verbose ("%s: could not get credentials from uid string: %s\n",
+                         DBUS_AUTH_NAME (auth), error.message);
+          dbus_error_free (&error);
           return send_rejected (auth);
         }
     }
index 90a55a7c00083a8cca5811ce8f025a08baff0c60..4ad87edca8dbde12ec7bdd03c90d679f816dc0b5 100644 (file)
@@ -2064,11 +2064,18 @@ _dbus_concat_dir_and_file (DBusString       *dir,
  * @returns #TRUE if the username existed and we got some credentials
  */
 dbus_bool_t
-_dbus_credentials_add_from_user (DBusCredentials  *credentials,
-                                     const DBusString *username)
+_dbus_credentials_add_from_user (DBusCredentials         *credentials,
+                                 const DBusString        *username,
+                                 DBusError               *error)
 {
-  return _dbus_credentials_add_windows_sid (credentials,
-                    _dbus_string_get_const_data(username));
+  if (!_dbus_credentials_add_windows_sid (credentials,
+                                          _dbus_string_get_const_data (username)))
+    {
+      _DBUS_SET_OOM (error);
+      return FALSE;
+    }
+
+  return TRUE;
 }
 
 /**
index 6892247f16acc2ca4dff0a122ea6a020da2bc104..48d3e766e593110e4bbfa6fe7522a8aa768b357e 100644 (file)
@@ -240,8 +240,10 @@ dbus_bool_t _dbus_read_credentials_socket (DBusSocket        client_fd,
 dbus_bool_t _dbus_send_credentials_socket (DBusSocket       server_fd,
                                            DBusError       *error);
 
-dbus_bool_t _dbus_credentials_add_from_user            (DBusCredentials  *credentials,
-                                                        const DBusString *username);
+dbus_bool_t _dbus_credentials_add_from_user            (DBusCredentials         *credentials,
+                                                        const DBusString        *username,
+                                                        DBusError               *error);
+
 dbus_bool_t _dbus_credentials_add_from_current_process (DBusCredentials  *credentials);
 DBUS_PRIVATE_EXPORT
 dbus_bool_t _dbus_append_user_from_current_process     (DBusString        *str);
index f79884c77ecbc8e885ea394af02f359ada34a1eb..577a5bc17ebb450965cec39f1878387eac7655ce 100644 (file)
@@ -517,8 +517,9 @@ _dbus_homedir_from_uid (dbus_uid_t         uid,
  * @returns #TRUE if the username existed and we got some credentials
  */
 dbus_bool_t
-_dbus_credentials_add_from_user (DBusCredentials  *credentials,
-                                 const DBusString *username)
+_dbus_credentials_add_from_user (DBusCredentials         *credentials,
+                                 const DBusString        *username,
+                                 DBusError               *error)
 {
   DBusUserDatabase *db;
   const DBusUserInfo *info;
@@ -535,19 +536,22 @@ _dbus_credentials_add_from_user (DBusCredentials  *credentials,
       return TRUE;
     }
 
-  /* FIXME: this can't distinguish ENOMEM from other errors */
   if (!_dbus_user_database_lock_system ())
-    return FALSE;
+    {
+      _DBUS_SET_OOM (error);
+      return FALSE;
+    }
 
   db = _dbus_user_database_get_system ();
   if (db == NULL)
     {
       _dbus_user_database_unlock_system ();
+      _DBUS_SET_OOM (error);
       return FALSE;
     }
 
   if (!_dbus_user_database_get_username (db, username,
-                                         &info, NULL))
+                                         &info, error))
     {
       _dbus_user_database_unlock_system ();
       return FALSE;
@@ -556,6 +560,7 @@ _dbus_credentials_add_from_user (DBusCredentials  *credentials,
   if (!_dbus_credentials_add_unix_uid(credentials, info->uid))
     {
       _dbus_user_database_unlock_system ();
+      _DBUS_SET_OOM (error);
       return FALSE;
     }