diff options
| author | Havoc Pennington <hp@redhat.com> | 2007-06-18 18:05:21 +0000 | 
|---|---|---|
| committer | Havoc Pennington <hp@redhat.com> | 2007-06-18 18:05:21 +0000 | 
| commit | ded479fda43da9dbe5780d0a2b287b5b1dcac64e (patch) | |
| tree | 4708d9539a264a0cd636ab5f4ee4ed9afb02c10f | |
| parent | 98f19852078cf03f8b50a93d49d83b85c0dd400b (diff) | |
2007-06-18  Havoc Pennington  <hp@redhat.com>
	* dbus/dbus-sysdeps-unix.c (_dbus_read_credentials_socket): clean
	this up a little bit, to try and understand why telnet'ing to a
	server and sending a non-nul byte didn't disconnect immediately;
	now it seems that it does disconnect immediately as it should,
	though I don't understand what has changed.
| -rw-r--r-- | ChangeLog | 8 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-unix.c | 32 | ||||
| -rw-r--r-- | dbus/dbus-transport-socket.c | 8 | 
3 files changed, 39 insertions, 9 deletions
@@ -1,4 +1,12 @@  2007-06-18  Havoc Pennington  <hp@redhat.com> +	 +	* dbus/dbus-sysdeps-unix.c (_dbus_read_credentials_socket): clean +	this up a little bit, to try and understand why telnet'ing to a +	server and sending a non-nul byte didn't disconnect immediately; +	now it seems that it does disconnect immediately as it should, +	though I don't understand what has changed. + +2007-06-18  Havoc Pennington  <hp@redhat.com>  	* dbus/dbus-watch.c (dbus_watch_get_socket)  	(dbus_watch_get_unix_fd): new API to match DBusConnection diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index ea8abcff..69abab00 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -991,20 +991,21 @@ _dbus_read_credentials_socket  (int              client_fd,    char buf;    dbus_uid_t uid_read;    dbus_pid_t pid_read; - +  int bytes_read; +      uid_read = DBUS_UID_UNSET;    pid_read = DBUS_PID_UNSET;  #ifdef HAVE_CMSGCRED     struct { -	  struct cmsghdr hdr; -	  struct cmsgcred cred; +    struct cmsghdr hdr; +    struct cmsgcred cred;    } cmsg;  #elif defined(LOCAL_CREDS)    struct { -	  struct cmsghdr hdr; -	  struct sockcred cred; +    struct cmsghdr hdr; +    struct sockcred cred;    } cmsg;  #endif @@ -1040,18 +1041,33 @@ _dbus_read_credentials_socket  (int              client_fd,  #endif   again: -  if (recvmsg (client_fd, &msg, 0) < 0) +  bytes_read = recvmsg (client_fd, &msg, 0); + +  if (bytes_read < 0)      {        if (errno == EINTR)  	goto again; +      /* EAGAIN or EWOULDBLOCK would be unexpected here since we would +       * normally only call read_credentials if the socket was ready +       * for reading +       */ +              dbus_set_error (error, _dbus_error_from_errno (errno),                        "Failed to read credentials byte: %s",                        _dbus_strerror (errno));        return FALSE;      } - -  if (buf != '\0') +  else if (bytes_read == 0) +    { +      /* this should not happen unless we are using recvmsg wrong, +       * so is essentially here for paranoia +       */ +      dbus_set_error (error, DBUS_ERROR_FAILED, +                      "Failed to read credentials byte (zero-length read)"); +      return FALSE; +    } +  else if (buf != '\0')      {        dbus_set_error (error, DBUS_ERROR_FAILED,                        "Credentials byte was not nul"); diff --git a/dbus/dbus-transport-socket.c b/dbus/dbus-transport-socket.c index 5ef4e8bf..4a713c80 100644 --- a/dbus/dbus-transport-socket.c +++ b/dbus/dbus-transport-socket.c @@ -361,7 +361,13 @@ exchange_credentials (DBusTransport *transport,    if (do_reading && transport->receive_credentials_pending)      { -      /* FIXME this can fail due to IO error _or_ OOM, broken */ +      /* FIXME this can fail due to IO error _or_ OOM, broken +       * (somewhat tricky to fix since the OOM error can be set after +       * we already read the credentials byte, so basically we need to +       * separate reading the byte and storing it in the +       * transport->credentials). Does not really matter for now +       * because storing in credentials never actually fails on unix. +       */              if (_dbus_read_credentials_socket (socket_transport->fd,                                           transport->credentials,                                           &error))  | 
