run-overflow.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. plan_tests(26);
  14. tal_set_backend(NULL, NULL, NULL, my_error);
  15. p = tal_arr(NULL, int, (size_t)-1);
  16. ok1(!p);
  17. ok1(error_count == 1);
  18. p = tal_arr(NULL, char, (size_t)-2);
  19. ok1(!p);
  20. ok1(error_count == 2);
  21. /* Now try overflow cases for tal_dup. */
  22. error_count = 0;
  23. pi = origpi = tal_arr(NULL, int, 100);
  24. ok1(pi);
  25. ok1(error_count == 0);
  26. pi = tal_dup(NULL, int, pi, (size_t)-1, 0);
  27. ok1(!pi);
  28. ok1(error_count == 1);
  29. pi = tal_dup(NULL, int, pi, 0, (size_t)-1);
  30. ok1(!pi);
  31. ok1(error_count == 2);
  32. pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int),
  33. (size_t)-1UL / sizeof(int));
  34. ok1(!pi);
  35. ok1(error_count == 3);
  36. /* This will still overflow when tal_hdr is added. */
  37. pi = tal_dup(NULL, int, pi, (size_t)-1UL / sizeof(int) / 2,
  38. (size_t)-1UL / sizeof(int) / 2);
  39. ok1(!pi);
  40. ok1(error_count == 4);
  41. /* Now, check that with TAL_TAKE we free old one on failure. */
  42. pi = tal_arr(NULL, int, 100);
  43. error_count = 0;
  44. pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1, 0);
  45. ok1(!pi);
  46. ok1(error_count == 1);
  47. ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
  48. pi = tal_arr(NULL, int, 100);
  49. error_count = 0;
  50. pi = tal_dup(TAL_TAKE, int, pi, 0, (size_t)-1);
  51. ok1(!pi);
  52. ok1(error_count == 1);
  53. ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
  54. pi = tal_arr(NULL, int, 100);
  55. error_count = 0;
  56. pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int),
  57. (size_t)-1UL / sizeof(int));
  58. ok1(!pi);
  59. ok1(error_count == 1);
  60. ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
  61. pi = tal_arr(NULL, int, 100);
  62. error_count = 0;
  63. /* This will still overflow when tal_hdr is added. */
  64. pi = tal_dup(TAL_TAKE, int, pi, (size_t)-1UL / sizeof(int) / 2,
  65. (size_t)-1UL / sizeof(int) / 2);
  66. ok1(!pi);
  67. ok1(error_count == 1);
  68. ok1(tal_first(NULL) == origpi && !tal_next(NULL, origpi));
  69. return exit_status();
  70. }