From b0091cf47e1172b1d5c1b0c060efe8b60c3b11e1 Mon Sep 17 00:00:00 2001 From: Frank Osterfeld Date: Wed, 21 Oct 2009 20:08:12 +0300 Subject: [PATCH] Improve error handling in nonce code Replace errno (from assuan code) by DBusError. Errors are not passed through dbus_accept_with_nonce atm, as the original _dbus_accept() has no error arg either. Cherry-picked from commit 8082e92bb3a6304362e730f8b6e324860e1bb26c in the dbus4win repository, edited to apply and fix whitespace issues by tml@iki.fi. --- dbus/dbus-nonce.c | 43 +++++++++++++++++++++++++------------------ dbus/dbus-nonce.h | 6 ++++-- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/dbus/dbus-nonce.c b/dbus/dbus-nonce.c index bca60e0..2ed0072 100644 --- a/dbus/dbus-nonce.c +++ b/dbus/dbus-nonce.c @@ -33,12 +33,8 @@ #include #endif -#ifndef ENOFILE -# define ENOFILE ENOENT -#endif - dbus_bool_t -_dbus_check_nonce (int fd, const DBusString *nonce) +_dbus_check_nonce (int fd, const DBusString *nonce, DBusError *error) { DBusString buffer; DBusString p; @@ -46,11 +42,18 @@ _dbus_check_nonce (int fd, const DBusString *nonce) dbus_bool_t result; int n; + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + nleft = 16; - _dbus_string_init (&buffer); - _dbus_string_init (&p); -//PENDING(kdab) replace errno by DBusError + if ( !_dbus_string_init (&buffer) + || !_dbus_string_init (&p) ) { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + _dbus_string_free (&p); + _dbus_string_free (&buffer); + return; + } + while (nleft) { n = _dbus_read_socket (fd, &p, nleft); @@ -60,15 +63,16 @@ _dbus_check_nonce (int fd, const DBusString *nonce) _dbus_sleep_milliseconds (100); else if (n==-1) { + dbus_set_error (error, DBUS_ERROR_IO_ERROR, "Could not read nonce from socket (fd=%d)", fd ); _dbus_string_free (&p); _dbus_string_free (&buffer); return FALSE; } else if (!n) { - _dbus_string_free (&p); - _dbus_string_free (&buffer); - errno = EIO; + _dbus_string_free (&p); + _dbus_string_free (&buffer); + dbus_set_error (error, DBUS_ERROR_IO_ERROR, "Could not read nonce from socket (fd=%d)", fd ); return FALSE; } else @@ -80,7 +84,7 @@ _dbus_check_nonce (int fd, const DBusString *nonce) result = _dbus_string_equal_len (&buffer, nonce, 16); if (!result) - errno = EACCES; + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, "Nonces do not match, access denied (fd=%d)", fd ); _dbus_string_free (&p); _dbus_string_free (&buffer); @@ -90,13 +94,16 @@ _dbus_check_nonce (int fd, const DBusString *nonce) //PENDING(kdab) document dbus_bool_t -_dbus_read_nonce (const DBusString *fname, DBusString *nonce) +_dbus_read_nonce (const DBusString *fname, DBusString *nonce, DBusError* error) { //PENDING(kdab) replace errno by DBusError FILE *fp; char buffer[17]; buffer[sizeof buffer - 1] = '\0'; size_t nread; + + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + _dbus_verbose ("reading nonce from file: %s\n", _dbus_string_get_const_data (fname)); @@ -107,13 +114,13 @@ _dbus_read_nonce (const DBusString *fname, DBusString *nonce) fclose (fp); if (!nread) { - errno = ENOFILE; + dbus_set_error (error, DBUS_ERROR_FILE_NOT_FOUND, "Could not read nonce from file %s", _dbus_string_get_const_data (fname)); return FALSE; } if (!_dbus_string_append_len (nonce, buffer, sizeof buffer - 1 )) { - errno = ENOMEM; + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); return FALSE; } return TRUE; @@ -127,7 +134,7 @@ _dbus_accept_with_nonce (int listen_fd, const DBusString *nonce) fd = _dbus_accept (listen_fd); if (_dbus_socket_is_invalid (fd)) return fd; - if (_dbus_check_nonce(fd, nonce) != TRUE) { + if (_dbus_check_nonce(fd, nonce, NULL) != TRUE) { _dbus_verbose ("nonce check failed. Closing socket.\n"); _dbus_close_socket(fd, NULL); return -1; @@ -143,7 +150,7 @@ _dbus_accept_with_noncefile (int listen_fd, const DBusString *noncefile) DBusString nonce; _dbus_string_init (&nonce); //PENDING(kdab): set better errors - if (_dbus_read_nonce (noncefile, &nonce) != TRUE) + if (_dbus_read_nonce (noncefile, &nonce, NULL) != TRUE) return -1; return _dbus_accept_with_nonce (listen_fd, &nonce); } @@ -218,7 +225,7 @@ _dbus_send_nonce(int fd, const DBusString *noncefile, DBusError *error) return FALSE; } - read_result = _dbus_read_nonce (noncefile, &nonce); + read_result = _dbus_read_nonce (noncefile, &nonce, NULL); if (!read_result) { diff --git a/dbus/dbus-nonce.h b/dbus/dbus-nonce.h index 85cfd7f..f91dc57 100644 --- a/dbus/dbus-nonce.h +++ b/dbus/dbus-nonce.h @@ -31,10 +31,12 @@ DBUS_BEGIN_DECLS dbus_bool_t _dbus_check_nonce (int fd, - const DBusString *nonce); + const DBusString *nonce, + DBusError *error); dbus_bool_t _dbus_read_nonce (const DBusString *fname, - DBusString *nonce); + DBusString *nonce, + DBusError *error); int _dbus_accept_with_nonce (int listen_fd, const DBusString *nonce); -- 2.7.4