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)
128 magic_ctx = magic_open(0);
129 if (magic_ctx == NULL) {
130 printf(
"failure retrieving magic_ctx\n");
134 if (magic_load(magic_ctx, NULL) == -1) {
135 printf(
"failure magic_load\n");
141 magic_close(magic_ctx);
146 static int MagicDetectTest01(
void)
150 char buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
151 size_t buffer_len =
sizeof(buffer);
154 magic_ctx = magic_open(0);
155 if (magic_ctx == NULL) {
156 printf(
"failure retrieving magic_ctx\n");
160 if (magic_load(magic_ctx, NULL) == -1) {
161 printf(
"magic_load failure\n");
165 result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
166 if (result == NULL || strncmp(result,
"PDF document", 12) != 0) {
167 printf(
"result %p:%s, not \"PDF document\": ", result,result?result:
"(null)");
173 magic_close(magic_ctx);
178 static int MagicDetectTest02(
void)
184 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 0x3e, 0x00, 0x03, 0x00, 0xfe, 0xff, 0x09, 0x00,
189 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
191 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x10, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
194 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
195 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
196 0x97, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
197 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
199 size_t buffer_len =
sizeof(buffer);
202 magic_ctx = magic_open(0);
203 if (magic_ctx == NULL) {
204 printf(
"failure retrieving magic_ctx\n");
208 if (magic_load(magic_ctx, NULL) == -1) {
209 printf(
"magic_load failure\n");
213 result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
214 if (result == NULL || strcmp(result, MICROSOFT_OFFICE_DOC) != 0) {
215 printf(
"result %p:%s, not \"Microsoft Office Document\": ", result,result?result:
"(null)");
221 magic_close(magic_ctx);
226 static int MagicDetectTest03(
void)
229 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
231 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
232 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
234 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
235 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
236 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
237 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
239 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
240 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
241 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
242 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
245 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
246 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
247 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
249 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
250 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
252 size_t buffer_len =
sizeof(buffer);
254 magic_t magic_ctx = magic_open(0);
257 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
259 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
262 char *
str = strstr(result,
"OpenDocument Text");
265 magic_close(magic_ctx);
270 static int MagicDetectTest04(
void)
276 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
277 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
278 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
279 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
281 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
282 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
283 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
284 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
286 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
287 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
291 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
292 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
293 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
294 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
296 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
297 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
298 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
299 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
301 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
302 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
303 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
305 size_t buffer_len =
sizeof(buffer);
308 magic_ctx = magic_open(0);
309 if (magic_ctx == NULL) {
310 printf(
"failure retrieving magic_ctx\n");
314 if (magic_load(magic_ctx, NULL) == -1) {
315 printf(
"magic_load failure\n");
319 result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
320 if (result == NULL || strncmp(result,
"OpenOffice.org 1.x", 18) != 0) {
321 printf(
"result %p:%s, not \"OpenOffice.org 1.x\": ", result,result?result:
"(null)");
327 magic_close(magic_ctx);
333 static int MagicDetectTest05(
void)
335 const char *result = NULL;
337 uint8_t buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
338 size_t buffer_len =
sizeof(buffer);
342 ctx = MagicInitContext();
345 result = MagicThreadLookup(&
ctx, buffer, buffer_len);
346 if (result == NULL || strncmp(result,
"PDF document", 12) != 0) {
347 printf(
"result %p:%s, not \"PDF document\": ", result,result?result:
"(null)");
353 MagicDeinitContext(
ctx);
359 static int MagicDetectTest06(
void)
361 const char *result = NULL;
363 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x3e, 0x00, 0x03, 0x00, 0xfe, 0xff, 0x09, 0x00,
368 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
370 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x10, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
373 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
374 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
375 0x97, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
376 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
378 size_t buffer_len =
sizeof(buffer);
381 if (MagicInit() < 0) {
382 printf(
"MagicInit() failure\n");
386 result = MagicGlobalLookup(buffer, buffer_len);
387 if (result == NULL || strcmp(result, MICROSOFT_OFFICE_DOC) != 0) {
388 printf(
"result %p:%s, not \"Microsoft Office Document\": ", result,result?result:
"(null)");
400 static int MagicDetectTest07(
void)
402 const char *result = NULL;
405 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
407 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
408 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
410 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
411 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
412 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
413 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
415 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
416 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
417 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
418 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
421 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
422 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
423 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
425 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
426 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
428 size_t buffer_len =
sizeof(buffer);
430 ctx = MagicInitContext();
433 result = MagicThreadLookup(&
ctx, buffer, buffer_len);
436 char *
str = strstr(result,
"OpenDocument Text");
439 MagicDeinitContext(
ctx);
444 static int MagicDetectTest08(
void)
446 const char *result = NULL;
449 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
450 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
451 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
452 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
454 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
455 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
456 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
457 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
459 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
460 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
464 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
465 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
466 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
467 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
469 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
470 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
471 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
473 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
474 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
475 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
476 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
478 size_t buffer_len =
sizeof(buffer);
481 ctx = MagicInitContext();
484 result = MagicThreadLookup(&
ctx, buffer, buffer_len);
485 if (result == NULL || strncmp(result,
"OpenOffice.org 1.x", 18) != 0) {
486 printf(
"result %p:%s, not \"OpenOffice.org 1.x\": ", result,result?result:
"(null)");
492 MagicDeinitContext(
ctx);
497 static int MagicDetectTest09(
void)
499 const char *result1 = NULL;
500 const char *result2 = NULL;
501 uint8_t buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
502 size_t buffer_len =
sizeof(buffer);
505 if (MagicInit() < 0) {
506 printf(
"MagicInit() failure\n");
510 result1 = MagicGlobalLookup(buffer, buffer_len);
511 if (result1 == NULL || strncmp(result1,
"PDF document", 12) != 0) {
512 printf(
"result %p:%s, not \"PDF document\": ", result1,result1?result1:
"(null)");
516 result2 = MagicGlobalLookup(buffer, buffer_len);
517 if (result2 == NULL || strncmp(result2,
"PDF document", 12) != 0) {
518 printf(
"result %p:%s, not \"PDF document\": ", result2,result2?result2:
"(null)");
522 if (result1 != result2) {
523 printf(
"pointers not equal, weird... %p != %p: ", result1, result2);
535 static int MagicDetectTest10ValgrindError(
void)
537 const char *result = NULL;
540 0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x01,0x2C,
541 0x01,0x2C,0x00,0x00,0xFF,0xFE,0x00,0x4C,0x53,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,
542 0x65,0x3A,0x34,0x31,0x31,0x65,0x33,0x38,0x61,0x61,0x61,0x31,0x37,0x65,0x33,0x30,
543 0x66,0x30,0x32,0x38,0x62,0x61,0x30,0x31,0x36,0x32,0x36,0x37,0x66,0x66,0x30,0x31,
544 0x36,0x36,0x61,0x65,0x35,0x39,0x65,0x38,0x31,0x39,0x62,0x61,0x32,0x34,0x63,0x39,
545 0x62,0x31,0x33,0x37,0x33,0x62,0x31,0x61,0x35,0x61,0x38,0x65,0x64,0x63,0x36,0x30,
546 0x65,0x37,0xFF,0xE2,0x02,0x2C,0x49,0x43,0x43,0x5F,0x50,0x52,0x4F,0x46,0x49,0x4C,
547 0x45,0x00,0x01,0x01,0x00,0x00,0x02,0x1C,0x41,0x44,0x42,0x45,0x02,0x10,0x00,0x00,
548 0x6D,0x6E,0x74,0x72,0x52,0x47,0x42,0x20,0x58,0x59,0x5A,0x20,0x07,0xCF,0x00,0x05,
549 0x00,0x09,0x00,0x15,0x00,0x0B,0x00,0x21,0x61,0x63,0x73,0x70,0x41,0x50,0x50,0x4C,
550 0x00,0x00,0x00,0x00,0x6E,0x6F,0x6E,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
552 size_t buffer_len =
sizeof(buffer);
556 ctx = MagicInitContext();
559 result = MagicThreadLookup(&
ctx, buffer, buffer_len);
560 if (result == NULL || strncmp(result,
"JPEG", 4) != 0) {
561 printf(
"result %p:%s, not \"JPEG\": ", result,result?result:
"(null)");
567 MagicDeinitContext(
ctx);
591 MagicDetectTest10ValgrindError);