Skip to content

Instantly share code, notes, and snippets.

@dvdhrm
Created September 29, 2014 08:25
Show Gist options
  • Select an option

  • Save dvdhrm/844b8a86ce2bf684c3be to your computer and use it in GitHub Desktop.

Select an option

Save dvdhrm/844b8a86ce2bf684c3be to your computer and use it in GitHub Desktop.
diff --git a/util.c b/util.c
index b2c8742..393f696 100644
--- a/util.c
+++ b/util.c
@@ -68,3 +68,151 @@ int kdbus_item_validate_name(const struct kdbus_item *item)
return kdbus_sysname_is_valid(item->str);
}
+
+int kdbus_item_validate(const struct kdbus_item *item)
+{
+ size_t payload_size = KDBUS_ITEM_PAYLOAD_SIZE(item);
+
+ if (item->size < KDBUS_ITEM_HEADER_SIZE)
+ return -EINVAL;
+
+ switch (item->type) {
+ case KDBUS_ITEM_PAYLOAD_VEC:
+ if (payload_size != sizeof(struct kdbus_vec))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_PAYLOAD_OFF:
+ if (payload_size != sizeof(struct kdbus_vec))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_PAYLOAD_MEMFD:
+ if (payload_size != sizeof(struct kdbus_memfd))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_FDS:
+ if (payload_size % sizeof(int) != 0)
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_BLOOM_PARAMETER:
+ if (payload_size != sizeof(struct kdbus_bloom_parameter))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_BLOOM_FILTER:
+ /* followed by the bloom-mask, depends on the bloom-size */
+ if (payload_size < sizeof(struct kdbus_bloom_filter))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_BLOOM_MASK:
+ /* size depends on bloom-size of bus */
+ break;
+
+ case KDBUS_ITEM_DST_NAME:
+ if (!kdbus_item_validate_nul(item))
+ return -EINVAL;
+ break;
+
+ case KDBUS_ITEM_MAKE_NAME:
+ break;
+
+ case KDBUS_ITEM_MEMFD_NAME:
+ break;
+
+ case KDBUS_ITEM_ATTACH_FLAGS:
+ break;
+
+ case KDBUS_ITEM_NAME:
+ break;
+
+ case KDBUS_ITEM_ID:
+ break;
+
+ case KDBUS_ITEM_TIMESTAMP:
+ break;
+
+ case KDBUS_ITEM_CREDS:
+ break;
+
+ case KDBUS_ITEM_AUXGROUPS:
+ break;
+
+ case KDBUS_ITEM_PID_COMM:
+ break;
+
+ case KDBUS_ITEM_TID_COMM:
+ break;
+
+ case KDBUS_ITEM_EXE:
+ break;
+
+ case KDBUS_ITEM_CMDLINE:
+ break;
+
+ case KDBUS_ITEM_CGROUP:
+ break;
+
+ case KDBUS_ITEM_CAPS:
+ break;
+
+ case KDBUS_ITEM_SECLABEL:
+ break;
+
+ case KDBUS_ITEM_AUDIT:
+ break;
+
+ case KDBUS_ITEM_CONN_NAME:
+ break;
+
+ case KDBUS_ITEM_POLICY_ACCESS:
+ break;
+
+ case KDBUS_ITEM_NAME_ADD:
+ break;
+
+ case KDBUS_ITEM_NAME_REMOVE:
+ break;
+
+ case KDBUS_ITEM_NAME_CHANGE:
+ break;
+
+ case KDBUS_ITEM_ID_ADD:
+ break;
+
+ case KDBUS_ITEM_ID_REMOVE:
+ break;
+
+ case KDBUS_ITEM_REPLY_TIMEOUT:
+ break;
+
+ case KDBUS_ITEM_REPLY_DEAD:
+ break;
+
+ default:
+ break;
+ }
+}
+
+int kdbus_items_validate(const struct kdbus_item *items, size_t items_size)
+{
+ struct kdbus_item *item;
+ int ret;
+
+ KDBUS_ITEMS_FOREACH(item, items, items_size) {
+ if (!KDBUS_ITEM_VALID(item, items, items_size))
+ return -EINVAL;
+
+ ret = kdbus_item_validate(item);
+ if (ret < 0)
+ return ret;
+ }
+
+ if (!KDBUS_ITEMS_END(item, items, items_size))
+ return -EINVAL;
+
+ return 0;
+}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment