25
26
#include "dbus-internals.h"
26
27
#include "dbus-test.h"
27
28
#include "dbus-message-private.h"
28
29
#include "dbus-marshal-recursive.h"
29
30
#include "dbus-string.h"
31
#ifdef HAVE_UNIX_FD_PASSING
32
#include "dbus-sysdeps-unix.h"
36
/* Necessary for the Linux-specific fd leak checking code only */
37
#include <sys/types.h>
32
44
* @addtogroup DBusMessage
142
_dbus_check_fdleaks(void)
149
/* This works on Linux only */
151
if ((d = opendir("/proc/self/fd")))
155
while ((de = readdir(d)))
161
if (de->d_name[0] == '.')
165
l = strtol(de->d_name, &e, 10);
166
_dbus_assert(errno == 0 && e && !*e);
176
_dbus_warn("file descriptor %i leaked in %s.\n", fd, __FILE__);
177
_dbus_assert_not_reached("fdleaks");
129
185
static dbus_bool_t
130
186
check_have_valid_message (DBusMessageLoader *loader)
940
996
unsigned char v2_BYTE;
941
997
dbus_bool_t v_BOOLEAN;
942
998
DBusMessageIter iter, array_iter, struct_iter;
999
#ifdef HAVE_UNIX_FD_PASSING
944
1004
message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",
945
1005
"/org/freedesktop/TestPath",
1035
1095
_dbus_assert (strcmp (dbus_message_get_member (message),
1098
/* Path decomposing */
1099
dbus_message_set_path (message, NULL);
1100
dbus_message_get_path_decomposed (message, &decomposed);
1101
_dbus_assert (decomposed == NULL);
1102
dbus_free_string_array (decomposed);
1104
dbus_message_set_path (message, "/");
1105
dbus_message_get_path_decomposed (message, &decomposed);
1106
_dbus_assert (decomposed != NULL);
1107
_dbus_assert (decomposed[0] == NULL);
1108
dbus_free_string_array (decomposed);
1110
dbus_message_set_path (message, "/a/b");
1111
dbus_message_get_path_decomposed (message, &decomposed);
1112
_dbus_assert (decomposed != NULL);
1113
_dbus_assert (strcmp (decomposed[0], "a") == 0);
1114
_dbus_assert (strcmp (decomposed[1], "b") == 0);
1115
_dbus_assert (decomposed[2] == NULL);
1116
dbus_free_string_array (decomposed);
1118
dbus_message_set_path (message, "/spam/eggs");
1119
dbus_message_get_path_decomposed (message, &decomposed);
1120
_dbus_assert (decomposed != NULL);
1121
_dbus_assert (strcmp (decomposed[0], "spam") == 0);
1122
_dbus_assert (strcmp (decomposed[1], "eggs") == 0);
1123
_dbus_assert (decomposed[2] == NULL);
1124
dbus_free_string_array (decomposed);
1038
1126
dbus_message_unref (message);
1040
1128
/* Test the vararg functions */
1091
1182
_DBUS_N_ELEMENTS (our_boolean_array),
1092
1183
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &v_ARRAY_STRING,
1093
1184
_DBUS_N_ELEMENTS (our_string_array),
1094
1186
DBUS_TYPE_INVALID);
1125
1217
sig[i++] = DBUS_TYPE_BOOLEAN;
1126
1218
sig[i++] = DBUS_TYPE_ARRAY;
1127
1219
sig[i++] = DBUS_TYPE_STRING;
1128
sig[i++] = DBUS_TYPE_INVALID;
1221
message_without_unix_fds = dbus_message_copy(message);
1222
_dbus_assert(message_without_unix_fds);
1223
#ifdef HAVE_UNIX_FD_PASSING
1224
dbus_message_append_args (message,
1225
DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1227
sig[i++] = DBUS_TYPE_UNIX_FD;
1229
sig[i++] = DBUS_TYPE_INVALID;
1130
1231
_dbus_assert (i < (int) _DBUS_N_ELEMENTS (sig));
1202
1303
_dbus_message_loader_return_buffer (loader, buffer, 1);
1306
#ifdef HAVE_UNIX_FD_PASSING
1309
unsigned n_unix_fds;
1311
_dbus_message_loader_get_unix_fds(loader, &unix_fds, &n_unix_fds);
1312
_dbus_assert(n_unix_fds > 0);
1313
_dbus_assert(message->n_unix_fds == 1);
1314
unix_fds[0] = _dbus_dup(message->unix_fds[0], NULL);
1315
_dbus_assert(unix_fds[0] >= 0);
1316
_dbus_message_loader_return_unix_fds(loader, unix_fds, 1);
1205
1320
dbus_message_unref (message);
1207
1322
/* Now pop back the message */
1218
1333
if (dbus_message_get_reply_serial (message) != 5678)
1219
1334
_dbus_assert_not_reached ("reply serial fields differ");
1221
verify_test_message (message);
1336
dbus_message_unref (message);
1338
/* ovveride the serial, since it was reset by dbus_message_copy() */
1339
dbus_message_set_serial(message_without_unix_fds, 8901);
1341
dbus_message_lock (message_without_unix_fds);
1343
verify_test_message (message_without_unix_fds);
1224
1346
/* Marshal and demarshal the message. */
1230
1352
char garbage_header[DBUS_MINIMUM_HEADER_SIZE] = "xxx";
1232
if (!dbus_message_marshal (message, &marshalled, &len))
1354
if (!dbus_message_marshal (message_without_unix_fds, &marshalled, &len))
1233
1355
_dbus_assert_not_reached ("failed to marshal message");
1235
1357
_dbus_assert (len != 0);
1268
1390
_dbus_assert (dbus_message_demarshal_bytes_needed (garbage_header, DBUS_MINIMUM_HEADER_SIZE) == -1);
1271
dbus_message_unref (message);
1393
dbus_message_unref (message_without_unix_fds);
1272
1394
_dbus_message_loader_unref (loader);
1274
1396
check_memleaks ();
1397
_dbus_check_fdleaks();
1276
1399
/* Check that we can abandon a container */
1277
1400
message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",