test-fuzz.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stddef.h>
  4. #include <limits.h>
  5. #include "blob.h"
  6. #include "blobmsg.h"
  7. #define BLOBMSG_TYPE_TROUBLE INT_MAX
  8. static void fuzz_blobmsg_parse(const uint8_t *data, size_t size)
  9. {
  10. enum {
  11. FOO_MESSAGE,
  12. FOO_LIST,
  13. FOO_TESTDATA,
  14. __FOO_MAX
  15. };
  16. static const int blobmsg_type[] = {
  17. BLOBMSG_TYPE_UNSPEC,
  18. BLOBMSG_TYPE_ARRAY,
  19. BLOBMSG_TYPE_TABLE,
  20. BLOBMSG_TYPE_STRING,
  21. BLOBMSG_TYPE_INT64,
  22. BLOBMSG_TYPE_INT32,
  23. BLOBMSG_TYPE_INT16,
  24. BLOBMSG_TYPE_INT8,
  25. BLOBMSG_TYPE_DOUBLE,
  26. BLOBMSG_TYPE_TROUBLE,
  27. };
  28. static const struct blobmsg_policy foo_policy[] = {
  29. [FOO_MESSAGE] = {
  30. .name = "message",
  31. .type = BLOBMSG_TYPE_STRING,
  32. },
  33. [FOO_LIST] = {
  34. .name = "list",
  35. .type = BLOBMSG_TYPE_ARRAY,
  36. },
  37. [FOO_TESTDATA] = {
  38. .name = "testdata",
  39. .type = BLOBMSG_TYPE_TABLE,
  40. },
  41. };
  42. struct blob_attr *tb[__FOO_MAX];
  43. blobmsg_parse(foo_policy, __FOO_MAX, tb, (uint8_t *)data, size);
  44. blobmsg_parse_array(foo_policy, __FOO_MAX, tb, (uint8_t *)data, size);
  45. blobmsg_check_attr_len((struct blob_attr *)data, false, size);
  46. blobmsg_check_attr_len((struct blob_attr *)data, true, size);
  47. for (size_t i=0; i < ARRAY_SIZE(blobmsg_type); i++) {
  48. blobmsg_check_array_len((struct blob_attr *)data, blobmsg_type[i], size);
  49. blobmsg_check_attr_list_len((struct blob_attr *)data, blobmsg_type[i], size);
  50. }
  51. }
  52. static void fuzz_blob_parse(const uint8_t *data, size_t size)
  53. {
  54. enum {
  55. FOO_ATTR_NESTED,
  56. FOO_ATTR_BINARY,
  57. FOO_ATTR_STRING,
  58. FOO_ATTR_INT8,
  59. FOO_ATTR_INT16,
  60. FOO_ATTR_INT32,
  61. FOO_ATTR_INT64,
  62. FOO_ATTR_DOUBLE,
  63. __FOO_ATTR_MAX
  64. };
  65. static const struct blob_attr_info foo_policy[__FOO_ATTR_MAX] = {
  66. [FOO_ATTR_NESTED] = { .type = BLOB_ATTR_NESTED },
  67. [FOO_ATTR_BINARY] = { .type = BLOB_ATTR_BINARY },
  68. [FOO_ATTR_STRING] = { .type = BLOB_ATTR_STRING },
  69. [FOO_ATTR_INT8] = { .type = BLOB_ATTR_INT8 },
  70. [FOO_ATTR_INT16] = { .type = BLOB_ATTR_INT16 },
  71. [FOO_ATTR_INT32] = { .type = BLOB_ATTR_INT32 },
  72. [FOO_ATTR_INT64] = { .type = BLOB_ATTR_INT64 },
  73. [FOO_ATTR_DOUBLE] = { .type = BLOB_ATTR_DOUBLE },
  74. };
  75. struct blob_attr *foo[__FOO_ATTR_MAX];
  76. struct blob_attr *buf = (struct blob_attr *)data;
  77. blob_parse_untrusted(buf, size, foo, foo_policy, __FOO_ATTR_MAX);
  78. }
  79. int LLVMFuzzerTestOneInput(const uint8_t *input, size_t size)
  80. {
  81. uint8_t *data;
  82. data = malloc(size);
  83. if (!data)
  84. return -1;
  85. memcpy(data, input, size);
  86. fuzz_blob_parse(data, size);
  87. fuzz_blobmsg_parse(data, size);
  88. free(data);
  89. return 0;
  90. }