run-overflow.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <ccan/tal/tal.h>
  2. #include <ccan/tal/tal.c>
  3. #include <ccan/tap/tap.h>
  4. static int error_count;
  5. static void my_error(const char *msg)
  6. {
  7. error_count++;
  8. }
  9. int main(void)
  10. {
  11. void *p;
  12. int *pi, *origpi;
  13. char *cp;
  14. plan_tests(30);
  15. tal_set_backend(NULL, NULL, NULL, my_error);
  16. p = tal_arr(NULL, int, (size_t)-1);
  17. ok1(!p);
  18. ok1(error_count == 1);
  19. p = tal_arr(NULL, char, (size_t)-2);
  20. ok1(!p);
  21. ok1(error_count == 2);
  22. /* Now try overflow cases for tal_dup. */
  23. error_count = 0;
  24. origpi = tal_arr(NULL, int, 100);
  25. ok1(origpi);
  26. ok1(error_count == 0);
  27. pi = tal_dup_arr(NULL, int, origpi, (size_t)-1, 0);
  28. ok1(!pi);
  29. ok1(error_count == 1);
  30. pi = tal_dup_arr(NULL, int, origpi, 0, (size_t)-1);
  31. ok1(!pi);
  32. ok1(error_count == 2);
  33. pi = tal_dup_arr(NULL, int, origpi, (size_t)-1UL / sizeof(int),
  34. (size_t)-1UL / sizeof(int));
  35. ok1(!pi);
  36. ok1(error_count == 3);
  37. /* This will still overflow when tal_hdr is added. */
  38. pi = tal_dup_arr(NULL, int, origpi, (size_t)-1UL / sizeof(int) / 2,
  39. (size_t)-1UL / sizeof(int) / 2);
  40. ok1(!pi);
  41. ok1(error_count == 4);
  42. ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
  43. tal_free(origpi);
  44. /* Now, check that with taltk() we free old one on failure. */
  45. origpi = tal_arr(NULL, int, 100);
  46. error_count = 0;
  47. pi = tal_dup_arr(NULL, int, take(origpi), (size_t)-1, 0);
  48. ok1(!pi);
  49. ok1(error_count == 1);
  50. origpi = tal_arr(NULL, int, 100);
  51. error_count = 0;
  52. pi = tal_dup_arr(NULL, int, take(origpi), 0, (size_t)-1);
  53. ok1(!pi);
  54. ok1(error_count == 1);
  55. ok1(!tal_first(NULL));
  56. origpi = tal_arr(NULL, int, 100);
  57. error_count = 0;
  58. pi = tal_dup_arr(NULL, int, take(origpi), (size_t)-1UL / sizeof(int),
  59. (size_t)-1UL / sizeof(int));
  60. ok1(!pi);
  61. ok1(error_count == 1);
  62. ok1(!tal_first(NULL));
  63. origpi = tal_arr(NULL, int, 100);
  64. error_count = 0;
  65. /* This will still overflow when tal_hdr is added. */
  66. pi = tal_dup_arr(NULL, int, take(origpi), (size_t)-1UL / sizeof(int) / 2,
  67. (size_t)-1UL / sizeof(int) / 2);
  68. ok1(!pi);
  69. ok1(error_count == 1);
  70. ok1(!tal_first(NULL));
  71. /* Overflow on expand addition. */
  72. cp = tal_arr(p, char, 100);
  73. ok1(!tal_expand(&cp, NULL, (size_t)-99UL));
  74. ok1(error_count == 2);
  75. tal_free(cp);
  76. /* Overflow when multiplied by size */
  77. origpi = tal_arr(NULL, int, 100);
  78. ok1(!tal_expand(&origpi, NULL, (size_t)-1UL / sizeof(int)));
  79. ok1(error_count == 3);
  80. tal_free(origpi);
  81. tal_cleanup();
  82. return exit_status();
  83. }