test: use kdbus_msg_dump() to check for message integrity
authorDaniel Mack <daniel@zonque.org>
Wed, 22 Oct 2014 09:49:05 +0000 (11:49 +0200)
committerDaniel Mack <daniel@zonque.org>
Wed, 22 Oct 2014 09:55:45 +0000 (11:55 +0200)
Make kdbus_msg_dump() return an error in case there's anything wrong
with the message. Return such errors from kdbus_msg_recv(). We currently
fail with notifications.

Signed-off-by: Daniel Mack <daniel@zonque.org>
test/kdbus-util.c
test/kdbus-util.h

index 2eef0e773e91e1e51ae991f32285eca135e4edde..c05c211c5c73f63a868642d1fe13efd88ef52dba 100644 (file)
@@ -465,13 +465,14 @@ static char *msg_id(uint64_t id, char *buf)
        return buf;
 }
 
-void kdbus_msg_dump(const struct kdbus_conn *conn, const struct kdbus_msg *msg)
+int kdbus_msg_dump(const struct kdbus_conn *conn, const struct kdbus_msg *msg)
 {
        const struct kdbus_item *item = msg->items;
        char buf_src[32];
        char buf_dst[32];
        uint64_t timeout = 0;
        uint64_t cookie_reply = 0;
+       int ret = 0;
 
        if (msg->flags & KDBUS_MSG_FLAGS_EXPECT_REPLY)
                timeout = msg->timeout_ns;
@@ -490,6 +491,7 @@ void kdbus_msg_dump(const struct kdbus_conn *conn, const struct kdbus_msg *msg)
                if (item->size < KDBUS_ITEM_HEADER_SIZE) {
                        kdbus_printf("  +%s (%llu bytes) invalid data record\n",
                                     enum_MSG(item->type), item->size);
+                       ret = -EINVAL;
                        break;
                }
 
@@ -677,10 +679,14 @@ void kdbus_msg_dump(const struct kdbus_conn *conn, const struct kdbus_msg *msg)
                }
        }
 
-       if ((char *)item - ((char *)msg + msg->size) >= 8)
+       if ((char *)item - ((char *)msg + msg->size) >= 8) {
                kdbus_printf("invalid padding at end of message\n");
+               ret = -EINVAL;
+       }
 
        kdbus_printf("\n");
+
+       return ret;
 }
 
 void kdbus_msg_free(struct kdbus_msg *msg)
@@ -724,7 +730,11 @@ int kdbus_msg_recv(struct kdbus_conn *conn,
        }
 
        msg = (struct kdbus_msg *)(conn->buf + recv.offset);
-       kdbus_msg_dump(conn, msg);
+       ret = kdbus_msg_dump(conn, msg);
+       if (ret < 0) {
+               kdbus_msg_free(msg);
+               return ret;
+       }
 
        if (msg_out) {
                *msg_out = msg;
index 962620bb82826bc4a4a1e776398f26e7d0725d7a..6dc262335b92dd2ffa9e40bb09f9e9b4da7a6366 100644 (file)
@@ -106,8 +106,8 @@ int kdbus_msg_recv(struct kdbus_conn *conn,
 int kdbus_msg_recv_poll(struct kdbus_conn *conn, int timeout_ms,
                        struct kdbus_msg **msg_out, uint64_t *offset);
 int kdbus_free(const struct kdbus_conn *conn, uint64_t offset);
-void kdbus_msg_dump(const struct kdbus_conn *conn,
-                   const struct kdbus_msg *msg);
+int kdbus_msg_dump(const struct kdbus_conn *conn,
+                  const struct kdbus_msg *msg);
 int kdbus_create_bus(int control_fd, const char *name, char **path);
 int kdbus_msg_send(const struct kdbus_conn *conn, const char *name,
                   uint64_t cookie, uint64_t flags, uint64_t timeout,