40 magic_t MagicInitContext(
void)
43 const char *filename = NULL;
54 if (filename != NULL) {
55 if (strlen(filename) == 0) {
64 if ( (fd = fopen(filename,
"r")) == NULL) {
65 SCLogWarning(
"Error opening file: \"%s\": %s", filename, strerror(errno));
72 if (magic_load(
ctx, filename) != 0) {
87 void MagicDeinitContext(magic_t
ctx)
101 char *MagicThreadLookup(magic_t *
ctx,
const uint8_t *
buf, uint32_t buflen)
103 const char *result = NULL;
106 if (
buf != NULL && buflen > 0) {
107 result = magic_buffer(*
ctx, (
void *)
buf, (
size_t)buflen);
108 if (result != NULL) {
122 static int MagicInitTest01(
void)
124 magic_t magic_ctx = magic_open(0);
126 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
127 magic_close(magic_ctx);
132 static int MagicDetectTest01(
void)
134 char buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
135 size_t buffer_len =
sizeof(buffer);
137 magic_t magic_ctx = magic_open(0);
139 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
141 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
143 FAIL_IF(strncmp(result,
"PDF document", 12) != 0);
144 magic_close(magic_ctx);
149 static int MagicDetectTest03(
void)
152 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
154 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
155 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
157 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
158 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
159 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
160 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
162 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
163 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
164 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
165 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
168 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
169 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
170 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
172 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
173 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
175 size_t buffer_len =
sizeof(buffer);
177 magic_t magic_ctx = magic_open(0);
180 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
182 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
185 char *
str = strstr(result,
"OpenDocument Text");
188 magic_close(magic_ctx);
193 static int MagicDetectTest04(
void)
196 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
197 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
198 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
199 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
201 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
202 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
203 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
204 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
206 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
207 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
211 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
212 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
213 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
214 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
216 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
217 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
218 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
219 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
221 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
222 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
223 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
225 size_t buffer_len =
sizeof(buffer);
227 magic_t magic_ctx = magic_open(0);
229 FAIL_IF(magic_load(magic_ctx, NULL) == -1);
231 char *result = (
char *)magic_buffer(magic_ctx, (
void *)buffer, buffer_len);
233 FAIL_IF(strncmp(result,
"OpenOffice.org 1.x", 18) != 0);
234 magic_close(magic_ctx);
239 static int MagicDetectTest05(
void)
241 uint8_t buffer[] = { 0x25,
'P',
'D',
'F',
'-',
'1',
'.',
'3', 0x0d, 0x0a};
242 size_t buffer_len =
sizeof(buffer);
244 magic_t
ctx = MagicInitContext();
247 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
249 FAIL_IF(strncmp(result,
"PDF document", 12) != 0);
250 MagicDeinitContext(
ctx);
256 static int MagicDetectTest07(
void)
259 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x0b, 0x55, 0x2a, 0x36, 0x5e, 0xc6,
261 0x32, 0x0c, 0x27, 0x00, 0x00, 0x00, 0x27, 0x00,
262 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
264 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
265 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
266 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6f, 0x61,
267 0x73, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
269 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
270 0x2e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x4b, 0x03,
271 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
272 0x55, 0x2a, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a,
275 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x66, 0x69,
276 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
277 0x73, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75,
279 0x73, 0x62, 0x61, 0x72, 0x2f, 0x50, 0x4b, 0x03,
280 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b,
282 size_t buffer_len =
sizeof(buffer);
284 magic_t
ctx = MagicInitContext();
287 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
290 char *
str = strstr(result,
"OpenDocument Text");
294 MagicDeinitContext(
ctx);
299 static int MagicDetectTest08(
void)
302 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x08,
303 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c, 0x8b, 0x70,
304 0x96, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
305 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6d, 0x69,
307 0x6d, 0x65, 0x74, 0x79, 0x70, 0x65, 0x61, 0x70,
308 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
309 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x73, 0x75,
310 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x62, 0x61,
312 0x73, 0x65, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00,
313 0x00, 0x08, 0x00, 0x00, 0x52, 0x7b, 0x86, 0x3c,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
317 0x4d, 0x45, 0x54, 0x41, 0x2d, 0x49, 0x4e, 0x46,
318 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00,
319 0x08, 0x08, 0x00, 0xa8, 0x42, 0x1d, 0x37, 0x5d,
320 0xa7, 0xb2, 0xc1, 0xde, 0x01, 0x00, 0x00, 0x7e,
322 0x04, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x63,
323 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x78,
324 0x6d, 0x6c, 0x95, 0x54, 0x4d, 0x6f, 0xdb, 0x30,
326 0x0c, 0xbd, 0xe7, 0x57, 0x18, 0x02, 0x06, 0x6c,
327 0x07, 0xc5, 0xe9, 0xb6, 0xc3, 0x22, 0xc4, 0x29,
328 0x86, 0x7d, 0x00, 0x05, 0x8a, 0x9d, 0xb2, 0x43,
329 0x8f, 0xb2, 0x24, 0xa7, 0xc2, 0x64, 0xc9, 0x15,
331 size_t buffer_len =
sizeof(buffer);
333 magic_t
ctx = MagicInitContext();
336 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
338 FAIL_IF(strncmp(result,
"OpenOffice.org 1.x", 18) != 0);
340 MagicDeinitContext(
ctx);
346 static int MagicDetectTest10ValgrindError(
void)
349 0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x01,0x2C,
350 0x01,0x2C,0x00,0x00,0xFF,0xFE,0x00,0x4C,0x53,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,
351 0x65,0x3A,0x34,0x31,0x31,0x65,0x33,0x38,0x61,0x61,0x61,0x31,0x37,0x65,0x33,0x30,
352 0x66,0x30,0x32,0x38,0x62,0x61,0x30,0x31,0x36,0x32,0x36,0x37,0x66,0x66,0x30,0x31,
353 0x36,0x36,0x61,0x65,0x35,0x39,0x65,0x38,0x31,0x39,0x62,0x61,0x32,0x34,0x63,0x39,
354 0x62,0x31,0x33,0x37,0x33,0x62,0x31,0x61,0x35,0x61,0x38,0x65,0x64,0x63,0x36,0x30,
355 0x65,0x37,0xFF,0xE2,0x02,0x2C,0x49,0x43,0x43,0x5F,0x50,0x52,0x4F,0x46,0x49,0x4C,
356 0x45,0x00,0x01,0x01,0x00,0x00,0x02,0x1C,0x41,0x44,0x42,0x45,0x02,0x10,0x00,0x00,
357 0x6D,0x6E,0x74,0x72,0x52,0x47,0x42,0x20,0x58,0x59,0x5A,0x20,0x07,0xCF,0x00,0x05,
358 0x00,0x09,0x00,0x15,0x00,0x0B,0x00,0x21,0x61,0x63,0x73,0x70,0x41,0x50,0x50,0x4C,
359 0x00,0x00,0x00,0x00,0x6E,0x6F,0x6E,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
361 size_t buffer_len =
sizeof(buffer);
363 magic_t
ctx = MagicInitContext();
366 char *result = MagicThreadLookup(&
ctx, buffer, buffer_len);
368 FAIL_IF(strncmp(result,
"JPEG", 4) != 0);
371 MagicDeinitContext(
ctx);
390 MagicDetectTest10ValgrindError);