]> git.proxmox.com Git - libgit2.git/blob - tests/core/errors.c
allocations: test for overflow of requested size
[libgit2.git] / tests / core / errors.c
1 #include "clar_libgit2.h"
2
3 void test_core_errors__public_api(void)
4 {
5 char *str_in_error;
6
7 giterr_clear();
8 cl_assert(giterr_last() == NULL);
9
10 giterr_set_oom();
11
12 cl_assert(giterr_last() != NULL);
13 cl_assert(giterr_last()->klass == GITERR_NOMEMORY);
14 str_in_error = strstr(giterr_last()->message, "memory");
15 cl_assert(str_in_error != NULL);
16
17 giterr_clear();
18
19 giterr_set_str(GITERR_REPOSITORY, "This is a test");
20
21 cl_assert(giterr_last() != NULL);
22 str_in_error = strstr(giterr_last()->message, "This is a test");
23 cl_assert(str_in_error != NULL);
24
25 giterr_clear();
26 cl_assert(giterr_last() == NULL);
27 }
28
29 #include "common.h"
30 #include "util.h"
31 #include "posix.h"
32
33 void test_core_errors__new_school(void)
34 {
35 char *str_in_error;
36
37 giterr_clear();
38 cl_assert(giterr_last() == NULL);
39
40 giterr_set_oom(); /* internal fn */
41
42 cl_assert(giterr_last() != NULL);
43 cl_assert(giterr_last()->klass == GITERR_NOMEMORY);
44 str_in_error = strstr(giterr_last()->message, "memory");
45 cl_assert(str_in_error != NULL);
46
47 giterr_clear();
48
49 giterr_set(GITERR_REPOSITORY, "This is a test"); /* internal fn */
50
51 cl_assert(giterr_last() != NULL);
52 str_in_error = strstr(giterr_last()->message, "This is a test");
53 cl_assert(str_in_error != NULL);
54
55 giterr_clear();
56 cl_assert(giterr_last() == NULL);
57
58 do {
59 struct stat st;
60 memset(&st, 0, sizeof(st));
61 cl_assert(p_lstat("this_file_does_not_exist", &st) < 0);
62 GIT_UNUSED(st);
63 } while (false);
64 giterr_set(GITERR_OS, "stat failed"); /* internal fn */
65
66 cl_assert(giterr_last() != NULL);
67 str_in_error = strstr(giterr_last()->message, "stat failed");
68 cl_assert(str_in_error != NULL);
69 cl_assert(git__prefixcmp(str_in_error, "stat failed: ") == 0);
70 cl_assert(strlen(str_in_error) > strlen("stat failed: "));
71
72 #ifdef GIT_WIN32
73 giterr_clear();
74
75 /* The MSDN docs use this to generate a sample error */
76 cl_assert(GetProcessId(NULL) == 0);
77 giterr_set(GITERR_OS, "GetProcessId failed"); /* internal fn */
78
79 cl_assert(giterr_last() != NULL);
80 str_in_error = strstr(giterr_last()->message, "GetProcessId failed");
81 cl_assert(str_in_error != NULL);
82 cl_assert(git__prefixcmp(str_in_error, "GetProcessId failed: ") == 0);
83 cl_assert(strlen(str_in_error) > strlen("GetProcessId failed: "));
84 #endif
85
86 giterr_clear();
87 }
88
89 void test_core_errors__restore(void)
90 {
91 git_error_state err_state = {0};
92
93 giterr_clear();
94 cl_assert(giterr_last() == NULL);
95
96 cl_assert_equal_i(0, giterr_capture(&err_state, 0));
97
98 memset(&err_state, 0x0, sizeof(git_error_state));
99
100 giterr_set(42, "Foo: %s", "bar");
101 cl_assert_equal_i(-1, giterr_capture(&err_state, -1));
102
103 cl_assert(giterr_last() == NULL);
104
105 giterr_set(99, "Bar: %s", "foo");
106
107 giterr_restore(&err_state);
108
109 cl_assert_equal_i(42, giterr_last()->klass);
110 cl_assert_equal_s("Foo: bar", giterr_last()->message);
111 }
112
113 static int test_arraysize_multiply(size_t nelem, size_t size)
114 {
115 GITERR_CHECK_ALLOC_MULTIPLY(nelem, size);
116 return 0;
117 }
118
119 void test_core_errors__integer_overflow_alloc_multiply(void)
120 {
121 cl_git_pass(test_arraysize_multiply(10, 10));
122 cl_git_pass(test_arraysize_multiply(1000, 1000));
123 cl_git_pass(test_arraysize_multiply(SIZE_MAX/sizeof(void *), sizeof(void *)));
124 cl_git_pass(test_arraysize_multiply(0, 10));
125 cl_git_pass(test_arraysize_multiply(10, 0));
126
127 cl_git_fail(test_arraysize_multiply(SIZE_MAX-1, sizeof(void *)));
128 cl_git_fail(test_arraysize_multiply((SIZE_MAX/sizeof(void *))+1, sizeof(void *)));
129
130 cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass);
131 cl_assert_equal_s("Out of memory", giterr_last()->message);
132 }
133
134 static int test_arraysize_add(size_t one, size_t two)
135 {
136 GITERR_CHECK_ALLOC_ADD(one, two);
137 return 0;
138 }
139
140 void test_core_errors__integer_overflow_alloc_add(void)
141 {
142 cl_git_pass(test_arraysize_add(10, 10));
143 cl_git_pass(test_arraysize_add(1000, 1000));
144 cl_git_pass(test_arraysize_add(SIZE_MAX-10, 10));
145
146 cl_git_fail(test_arraysize_multiply(SIZE_MAX-1, 2));
147 cl_git_fail(test_arraysize_multiply(SIZE_MAX, SIZE_MAX));
148
149 cl_assert_equal_i(GITERR_NOMEMORY, giterr_last()->klass);
150 cl_assert_equal_s("Out of memory", giterr_last()->message);
151 }