/src/yara/libyara/modules/tests/tests.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | Copyright (c) 2014. The YARA Authors. All Rights Reserved. |
3 | | |
4 | | Redistribution and use in source and binary forms, with or without modification, |
5 | | are permitted provided that the following conditions are met: |
6 | | |
7 | | 1. Redistributions of source code must retain the above copyright notice, this |
8 | | list of conditions and the following disclaimer. |
9 | | |
10 | | 2. Redistributions in binary form must reproduce the above copyright notice, |
11 | | this list of conditions and the following disclaimer in the documentation and/or |
12 | | other materials provided with the distribution. |
13 | | |
14 | | 3. Neither the name of the copyright holder nor the names of its contributors |
15 | | may be used to endorse or promote products derived from this software without |
16 | | specific prior written permission. |
17 | | |
18 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
19 | | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
20 | | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
21 | | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
22 | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
23 | | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
24 | | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
25 | | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 | | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
27 | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | | */ |
29 | | |
30 | | #include <assert.h> |
31 | | #include <yara/modules.h> |
32 | | |
33 | | #define MODULE_NAME tests |
34 | | |
35 | | define_function(fsum_2) |
36 | 0 | { |
37 | 0 | double a = float_argument(1); |
38 | 0 | double b = float_argument(2); |
39 | |
|
40 | 0 | return_float(a + b); |
41 | 0 | } |
42 | | |
43 | | define_function(fsum_3) |
44 | 0 | { |
45 | 0 | double a = float_argument(1); |
46 | 0 | double b = float_argument(2); |
47 | 0 | double c = float_argument(3); |
48 | |
|
49 | 0 | return_float(a + b + c); |
50 | 0 | } |
51 | | |
52 | | define_function(isum_2) |
53 | 0 | { |
54 | 0 | int64_t a = integer_argument(1); |
55 | 0 | int64_t b = integer_argument(2); |
56 | |
|
57 | 0 | return_integer(a + b); |
58 | 0 | } |
59 | | |
60 | | define_function(isum_3) |
61 | 0 | { |
62 | 0 | int64_t a = integer_argument(1); |
63 | 0 | int64_t b = integer_argument(2); |
64 | 0 | int64_t c = integer_argument(3); |
65 | |
|
66 | 0 | return_integer(a + b + c); |
67 | 0 | } |
68 | | |
69 | | define_function(length) |
70 | 0 | { |
71 | 0 | char* s = string_argument(1); |
72 | |
|
73 | 0 | return_integer(strlen(s)); |
74 | 0 | } |
75 | | |
76 | | define_function(empty) |
77 | 0 | { |
78 | 0 | return_string(""); |
79 | 0 | } |
80 | | |
81 | | define_function(match) |
82 | 0 | { |
83 | 0 | return_integer( |
84 | 0 | yr_re_match(yr_scan_context(), regexp_argument(1), string_argument(2))); |
85 | 0 | } |
86 | | |
87 | | define_function(foobar) |
88 | 0 | { |
89 | 0 | int64_t arg = integer_argument(1); |
90 | |
|
91 | 0 | switch (arg) |
92 | 0 | { |
93 | 0 | case 1: |
94 | 0 | return_string("foo"); |
95 | 0 | break; |
96 | 0 | case 2: |
97 | 0 | return_string("bar"); |
98 | 0 | break; |
99 | 0 | } |
100 | | |
101 | 0 | return_string("oops") |
102 | 0 | } |
103 | | |
104 | 1 | begin_declarations |
105 | 2 | begin_struct("constants") |
106 | 1 | declare_integer("one"); |
107 | 1 | declare_integer("two"); |
108 | 1 | declare_string("foo"); |
109 | 1 | declare_string("empty"); |
110 | 2 | end_struct("constants") |
111 | | |
112 | 2 | begin_struct("undefined") |
113 | 1 | declare_integer("i"); |
114 | 1 | declare_float("f"); |
115 | 2 | end_struct("undefined") |
116 | | |
117 | 1 | declare_string("module_data"); |
118 | 2 | declare_integer_array("integer_array"); |
119 | 2 | declare_string_array("string_array"); |
120 | | |
121 | 2 | declare_integer_dictionary("integer_dict"); |
122 | 2 | declare_string_dictionary("string_dict"); |
123 | | |
124 | 3 | begin_struct_array("struct_array") |
125 | 1 | declare_integer("i"); |
126 | 1 | declare_string("s"); |
127 | 2 | end_struct_array("struct_array") |
128 | | |
129 | 3 | begin_struct_dictionary("struct_dict") |
130 | 1 | declare_integer("i"); |
131 | 1 | declare_string("s"); |
132 | 2 | end_struct_dictionary("struct_dict"); |
133 | | |
134 | 3 | begin_struct_dictionary("empty_struct_dict") |
135 | 1 | declare_integer("unused"); |
136 | 2 | end_struct_dictionary("empty_struct_dict") |
137 | | |
138 | 3 | begin_struct_array("empty_struct_array") |
139 | 3 | begin_struct_array("struct_array") |
140 | 1 | declare_string("unused"); |
141 | 2 | end_struct_array("struct_array"); |
142 | 3 | begin_struct_dictionary("struct_dict") |
143 | 1 | declare_string("unused"); |
144 | 2 | end_struct_dictionary("struct_dict"); |
145 | 2 | end_struct_array("empty_struct_array"); |
146 | | |
147 | 2 | declare_function("match", "rs", "i", match); |
148 | 1 | declare_function("isum", "ii", "i", isum_2); |
149 | 1 | declare_function("isum", "iii", "i", isum_3); |
150 | 1 | declare_function("fsum", "ff", "f", fsum_2); |
151 | 1 | declare_function("fsum", "fff", "f", fsum_3); |
152 | 1 | declare_function("length", "s", "i", length); |
153 | 1 | declare_function("empty", "", "s", empty); |
154 | 1 | declare_function("foobar", "i", "s", foobar); |
155 | 1 | end_declarations |
156 | | |
157 | | int module_initialize(YR_MODULE* module) |
158 | 2 | { |
159 | 2 | return ERROR_SUCCESS; |
160 | 2 | } |
161 | | |
162 | | int module_finalize(YR_MODULE* module) |
163 | 0 | { |
164 | 0 | return ERROR_SUCCESS; |
165 | 0 | } |
166 | | |
167 | | int module_load( |
168 | | YR_SCAN_CONTEXT* context, |
169 | | YR_OBJECT* module_object, |
170 | | void* module_data, |
171 | | size_t module_data_size) |
172 | 0 | { |
173 | 0 | yr_set_integer(1, module_object, "constants.one"); |
174 | 0 | yr_set_integer(2, module_object, "constants.two"); |
175 | 0 | yr_set_string("foo", module_object, "constants.foo"); |
176 | 0 | yr_set_string("", module_object, "constants.empty"); |
177 | |
|
178 | 0 | yr_set_integer(1, module_object, "struct_array[1].i"); |
179 | |
|
180 | 0 | yr_set_integer(0, module_object, "integer_array[%i]", 0); |
181 | 0 | yr_set_integer(1, module_object, "integer_array[%i]", 1); |
182 | 0 | yr_set_integer(2, module_object, "integer_array[%i]", 2); |
183 | 0 | yr_set_integer(256, module_object, "integer_array[%i]", 256); |
184 | |
|
185 | 0 | yr_set_string("foo", module_object, "string_array[%i]", 0); |
186 | 0 | yr_set_string("bar", module_object, "string_array[%i]", 1); |
187 | 0 | yr_set_string("baz", module_object, "string_array[%i]", 2); |
188 | |
|
189 | 0 | yr_set_sized_string("foo\0bar", 7, module_object, "string_array[%i]", 3); |
190 | |
|
191 | 0 | yr_set_string("foo", module_object, "string_dict[%s]", "foo"); |
192 | 0 | yr_set_string("bar", module_object, "string_dict[\"bar\"]"); |
193 | |
|
194 | 0 | yr_set_string("foo", module_object, "struct_dict[%s].s", "foo"); |
195 | 0 | yr_set_integer(1, module_object, "struct_dict[%s].i", "foo"); |
196 | |
|
197 | 0 | if (module_data_size > 0 && module_data != NULL) |
198 | 0 | { |
199 | 0 | yr_set_sized_string( |
200 | 0 | (const char*) module_data, |
201 | 0 | module_data_size, |
202 | 0 | module_object, |
203 | 0 | "module_data"); |
204 | 0 | } |
205 | |
|
206 | 0 | return ERROR_SUCCESS; |
207 | 0 | } |
208 | | |
209 | | int module_unload(YR_OBJECT* module_object) |
210 | 0 | { |
211 | | // Fail if module_unload is called twice with the same module_object |
212 | 0 | if (module_object->data == (void*) 0xFABADA) |
213 | 0 | assert(false); |
214 | | |
215 | 0 | module_object->data = (void*) 0xFABADA; |
216 | 0 | return ERROR_SUCCESS; |
217 | 0 | } |