41 magic_t MagicInitContext(
void)
44 const char *filename = NULL;
55 if (filename != NULL) {
56 if (strlen(filename) == 0) {
65 if ( (fd = fopen(filename,
"r")) == NULL) {
66 SCLogWarning(
"Error opening file: \"%s\": %s", filename, strerror(errno));
73 if (magic_load(
ctx, filename) != 0) {
88 void MagicDeinitContext(magic_t
ctx)
102 char *MagicThreadLookup(magic_t *
ctx,
const uint8_t *
buf, uint32_t buflen)
104 const char *result = NULL;
107 if (
buf != NULL && buflen > 0) {
108 result = magic_buffer(*
ctx, (
void *)
buf, (
size_t)buflen);
109 if (result != NULL) {
123 static int MagicInitTest01(
void)
125 magic_t magic_ctx = magic_open(0);
127 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
128 magic_close(magic_ctx);
133 static int MagicDetectTest01(
void)
135 char buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
136 size_t buffer_len =
sizeof(buffer);
138 magic_t magic_ctx = magic_open(0);
140 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
142 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
144 FAIL_IF(strncmp(result,
"PDF document", 12) != 0);
145 magic_close(magic_ctx);
150 static int MagicDetectTest03(
void)
153 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
155 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
156 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
158 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
159 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
160 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
161 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
163 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
164 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
165 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
166 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
169 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
170 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
171 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
173 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
174 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
176 size_t buffer_len =
sizeof(buffer);
178 magic_t magic_ctx = magic_open(0);
181 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
183 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
186 char *
str = strstr(result,
"OpenDocument Text");
189 magic_close(magic_ctx);
194 static int MagicDetectTest04(
void)
197 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
198 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
199 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
200 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
202 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
203 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
204 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
205 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
207 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
208 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
212 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
213 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
214 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
215 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
217 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
218 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
219 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
220 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
222 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
223 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
224 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
226 size_t buffer_len =
sizeof(buffer);
228 magic_t magic_ctx = magic_open(0);
230 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
232 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
234 FAIL_IF(strncmp(result,
"OpenOffice.org 1.x", 18) != 0);
235 magic_close(magic_ctx);
240 static int MagicDetectTest05(
void)
242 uint8_t buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
243 size_t buffer_len =
sizeof(buffer);
245 magic_t
ctx = MagicInitContext();
248 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
250 FAIL_IF(strncmp(result,
"PDF document", 12) != 0);
251 MagicDeinitContext(
ctx);
257 static int MagicDetectTest07(
void)
260 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
262 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
263 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
265 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
266 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
267 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
268 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
270 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
271 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
272 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
273 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
276 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
277 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
278 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
280 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
281 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
283 size_t buffer_len =
sizeof(buffer);
285 magic_t
ctx = MagicInitContext();
288 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
291 char *
str = strstr(result,
"OpenDocument Text");
295 MagicDeinitContext(
ctx);
300 static int MagicDetectTest08(
void)
303 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
304 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
305 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
306 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
308 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
309 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
310 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
311 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
313 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
314 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
318 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
319 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
320 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
321 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
323 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
324 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
325 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
327 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
328 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
329 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
330 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
332 size_t buffer_len =
sizeof(buffer);
334 magic_t
ctx = MagicInitContext();
337 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
339 FAIL_IF(strncmp(result,
"OpenOffice.org 1.x", 18) != 0);
341 MagicDeinitContext(
ctx);
347 static int MagicDetectTest10ValgrindError(
void)
350 0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x01,0x2C,
351 0x01,0x2C,0x00,0x00,0xFF,0xFE,0x00,0x4C,0x53,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,
352 0x65,0x3A,0x34,0x31,0x31,0x65,0x33,0x38,0x61,0x61,0x61,0x31,0x37,0x65,0x33,0x30,
353 0x66,0x30,0x32,0x38,0x62,0x61,0x30,0x31,0x36,0x32,0x36,0x37,0x66,0x66,0x30,0x31,
354 0x36,0x36,0x61,0x65,0x35,0x39,0x65,0x38,0x31,0x39,0x62,0x61,0x32,0x34,0x63,0x39,
355 0x62,0x31,0x33,0x37,0x33,0x62,0x31,0x61,0x35,0x61,0x38,0x65,0x64,0x63,0x36,0x30,
356 0x65,0x37,0xFF,0xE2,0x02,0x2C,0x49,0x43,0x43,0x5F,0x50,0x52,0x4F,0x46,0x49,0x4C,
357 0x45,0x00,0x01,0x01,0x00,0x00,0x02,0x1C,0x41,0x44,0x42,0x45,0x02,0x10,0x00,0x00,
358 0x6D,0x6E,0x74,0x72,0x52,0x47,0x42,0x20,0x58,0x59,0x5A,0x20,0x07,0xCF,0x00,0x05,
359 0x00,0x09,0x00,0x15,0x00,0x0B,0x00,0x21,0x61,0x63,0x73,0x70,0x41,0x50,0x50,0x4C,
360 0x00,0x00,0x00,0x00,0x6E,0x6F,0x6E,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
362 size_t buffer_len =
sizeof(buffer);
364 magic_t
ctx = MagicInitContext();
367 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
369 FAIL_IF(strncmp(result,
"JPEG", 4) != 0);
372 MagicDeinitContext(
ctx);
391 MagicDetectTest10ValgrindError);