chiark / gitweb /
bus: enforce endianess and marshalling for messages we send
authorLennart Poettering <lennart@poettering.net>
Thu, 12 Dec 2013 18:58:46 +0000 (19:58 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 12 Dec 2013 19:00:45 +0000 (20:00 +0100)
src/libsystemd-bus/bus-internal.h
src/libsystemd-bus/bus-kernel.c
src/libsystemd-bus/bus-socket.c
src/libsystemd-bus/sd-bus.c

index 1be7488ab93f8067a60a8fca622f4f83ec824a56..df9a0b571ccdb522338ddb9539d21fda0514ffd5 100644 (file)
@@ -147,6 +147,7 @@ struct sd_bus {
         enum bus_state state;
         int input_fd, output_fd;
         int message_version;
+        int message_endian;
 
         bool is_kernel:1;
         bool can_fds:1;
index c5817a78d61f11d7d6d016176a68a6349e0294f5..68d0f48bd0047c423df0c9d97a48c4cf85f42aa1 100644 (file)
@@ -363,6 +363,7 @@ int bus_kernel_take_fd(sd_bus *b) {
         b->bus_client = true;
         b->can_fds = !!(hello.conn_flags & KDBUS_HELLO_ACCEPT_FD);
         b->message_version = 2;
+        b->message_endian = BUS_NATIVE_ENDIAN;
 
         /* the kernel told us the UUID of the underlying bus */
         memcpy(b->server_id.bytes, hello.id128, sizeof(b->server_id.bytes));
index a449ce0eb3aa65d1877bac08336c6359169cb8ff..1365092d736fa3f9eaadcfe8824c40d1a8c1c4aa 100644 (file)
@@ -625,6 +625,7 @@ int bus_socket_setup(sd_bus *b) {
 
         b->is_kernel = false;
         b->message_version = 1;
+        b->message_endian = 0;
 
         return 0;
 }
index 37408cf7b4e3007dfac882e496dbcc703f97d320..1a603563114ba6dc34055c36972679a9e2e5ca48 100644 (file)
@@ -1280,7 +1280,12 @@ static int bus_seal_message(sd_bus *b, sd_bus_message *m) {
         assert(b);
         assert(m);
 
-        if (m->header->version > b->message_version)
+        if (b->message_version != 0 &&
+            m->header->version != b->message_version)
+                return -EPERM;
+
+        if (b->message_endian != 0 &&
+            m->header->endian != b->message_endian)
                 return -EPERM;
 
         if (m->sealed) {
@@ -1298,9 +1303,6 @@ int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
         assert(b);
         assert(m);
 
-        if (m->header->version > b->message_version)
-                return -EPERM;
-
         /* The bus specification says the serial number cannot be 0,
          * hence let's fill something in for synthetic messages. Since
          * synthetic messages might have a fake sender and we don't