View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000193 | file | General | public | 2020-08-27 19:47 | 2020-09-05 17:17 |
Reporter | neal | Assigned To | christos | ||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | resolved | Resolution | fixed | ||
Fixed in Version | 5.40 | ||||
Summary | 0000193: use incorrectly resets the offset | ||||
Description | Consider the following magic file: 0 byte x >&10 byte x 1:%d >>&10 byte x 2:%d >&20 use foo >>&10 byte x 3:%d 0 name foo >&200 byte x 4:%d I would expect it to print: /tmp/byte.bin: 1:11 2:22 4:221 3:31 but it actually prints: /tmp/byte.bin: 1:11 2:22 4:221 3:10 It appears that when a 'use' returns, it does not reset ms->offset to the parent continuation's offset. | ||||
Steps To Reproduce | $ file -d -m /tmp/offset.magic /tmp/byte.bin unknown, 0: Warning: using regular magic file `/tmp/offset.magic' (no description): binary (no description): text [try zmagic 0] [try tar 0] [try json 0] [try cdf 0] [try elf 0] bb=[0x7f3ab19bb010,256], 0 [b=0x7f3ab19bb010,256], [o=0, c=0] mget(type=1, flag=0x20, offset=0, o=0, nbytes=256, il=0, nc=0) mget/96 @0: \000\001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ 1: > 0 byte&,x,""] 0 == *any* = 1 bb=[0x7f3ab19bb010,256], 10 [b=0x7f3ab19bb010,256], [o=0xa, c=1] mget(type=1, flag=0x2, offset=11, o=0, nbytes=256, il=0, nc=0) mget/96 @11: \v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij 2: >> 10 byte&,x,"1:%d"] 11 == *any* = 1 bb=[0x7f3ab19bb010,256], 10 [b=0x7f3ab19bb010,256], [o=0xa, c=2] mget(type=1, flag=0x2, offset=22, o=0, nbytes=256, il=0, nc=0) mget/96 @22: \026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu 3: >>> 10 byte&,x,"2:%d"] 22 == *any* = 1 bb=[0x7f3ab19bb010,256], 20 [b=0x7f3ab19bb010,256], [o=0x14, c=1] mget(type=46, flag=0x2, offset=21, o=0, nbytes=256, il=0, nc=0) mget/96 @21: \025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst 4: >> 20 use,='foo',""] bb=[0x7f3ab19bb010,256], 0 [b=0x7f3ab19bb010,256], [o=0, c=0] mget(type=45, flag=0, offset=0, o=21, nbytes=256, il=0, nc=1) mget/96 @0: \025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst 7: > 0 name,='foo',""] bb=[0x7f3ab19bb010,256], 200 [b=0x7f3ab19bb010,256], [o=0xc8, c=1] mget(type=1, flag=0x2, offset=200, o=21, nbytes=256, il=0, nc=1) mget/96 @200: \335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 8: >> 200 byte&,x,"4:%d"] 18446744073709551581 == *any* = 1 bb=[0x7f3ab19bb010,256], 10 [b=0x7f3ab19bb010,256], [o=0xa, c=2] mget(type=1, flag=0x2, offset=10, o=0, nbytes=256, il=0, nc=0) mget/96 @10: \n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi 5: >>> 10 byte&,x,"3:%d"] 10 == *any* = 1 [try softmagic 1] /tmp/byte.bin: 1:11 2:22 4:221 3:10 | ||||
Tags | No tags attached. | ||||
|
|
|
Another example: 0 byte x >&10 byte x 1:%d >>&10 byte x 2:%d >&10 byte x 3:%d >>&20 use foo >>>&10 byte x 4:%d >&10 byte x 5:%d 0 name foo >&200 byte x 6:%d $ file -m /tmp/offset.magic /tmp/byte.bin /tmp/byte.bin: 1:11 2:22 3:11 6:232 4:10 5:10 Since we have "4:10", it appears that not only is the parent continuation's offset ignored, but the offset is reset to 0. |
|
The attached patch appears to fix the problem: $ src/file -d -m /tmp/offset.magic /tmp/byte.bin unknown, 0: Warning: using regular magic file `/tmp/offset.magic' (no description): binary (no description): text [try zmagic 0] [try tar 0] [try json 0] [try csv 0] [try cdf 0] [try elf 0] bb=[0x7f6d3cd7c010,256,0], 0 [b=0x7f6d3cd7c010,256,0], [o=0, c=0] mget(type=1, flag=0x20, offset=0, o=0, nbytes=256, il=0, nc=0) mget/128 @0: \000\001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177 1: > 0 byte&,x,""] 0 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 10 [b=0x7f6d3cd7c010,256,0], [o=0xa, c=1] mget(type=1, flag=0x2, offset=11, o=0, nbytes=256, il=0, nc=0) mget/128 @11: \v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212 2: >> 10 byte&,x,"1:%d"] 11 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 10 [b=0x7f6d3cd7c010,256,0], [o=0xa, c=2] mget(type=1, flag=0x2, offset=22, o=0, nbytes=256, il=0, nc=0) mget/128 @22: \026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225 3: >>> 10 byte&,x,"2:%d"] 22 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 10 [b=0x7f6d3cd7c010,256,0], [o=0xa, c=1] mget(type=1, flag=0x2, offset=11, o=0, nbytes=256, il=0, nc=0) mget/128 @11: \v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212 4: >> 10 byte&,x,"3:%d"] 11 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 20 [b=0x7f6d3cd7c010,256,0], [o=0x14, c=2] mget(type=46, flag=0x2, offset=32, o=0, nbytes=256, il=0, nc=0) mget/128 @32: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237 5: >>> 20 use,='foo',""] bb=[0x7f6d3cd7c010,256,0], 0 [b=0x7f6d3cd7c010,256,0], [o=0, c=0] mget(type=45, flag=0, offset=0, o=32, nbytes=256, il=0, nc=1) mget/128 @0: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237 9: > 0 name,='foo',""] bb=[0x7f6d3cd7c010,256,0], 200 [b=0x7f6d3cd7c010,256,0], [o=0xc8, c=1] mget(type=1, flag=0x2, offset=200, o=32, nbytes=256, il=0, nc=1) mget/128 @200: \350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 10: >> 200 byte&,x,"6:%d"] 18446744073709551592 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 10 [b=0x7f6d3cd7c010,256,0], [o=0xa, c=3] mget(type=1, flag=0x2, offset=42, o=0, nbytes=256, il=0, nc=0) mget/128 @42: *+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251 6: >>>> 10 byte&,x,"4:%d"] 42 == *any* = 1 bb=[0x7f6d3cd7c010,256,0], 10 [b=0x7f6d3cd7c010,256,0], [o=0xa, c=1] mget(type=1, flag=0x2, offset=11, o=0, nbytes=256, il=0, nc=0) mget/128 @11: \v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212 7: >> 10 byte&,x,"5:%d"] 11 == *any* = 1 [try softmagic 1] /tmp/byte.bin: 1:11 2:22 3:11 6:232 4:42 5:11 Also, it fixes the value of line 7 (which I had overlooked): it should be 5:11, not 5:10. 0004-Save-ms-offset-around-calls-to-use.patch (1,505 bytes)
From 8f7abb631219b4fb58359250337aabf1e6ac4476 Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" <neal@gnu.org> Date: Fri, 28 Aug 2020 14:47:39 +0200 Subject: [PATCH 4/4] Save ms->offset around calls to use. --- src/softmagic.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/softmagic.c b/src/softmagic.c index f3ad21d0..5ecdd0b4 100644 --- a/src/softmagic.c +++ b/src/softmagic.c @@ -992,6 +992,10 @@ moffset(struct magic_set *ms, struct magic *m, const struct buffer *b, o = CAST(int32_t, (ms->offset + 2 * sizeof(uint64_t))); break; + case FILE_USE: + o = ms->offset; + break; + default: o = 0; break; @@ -1574,6 +1578,7 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b, union VALUETYPE *p = &ms->ms_value; struct mlist ml; int got_match; + uint32_t saved_offset; if (*indir_count >= ms->indir_max) { file_error(ms, 0, "indirect count (%hu) exceeded", @@ -1885,9 +1890,11 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b, *need_separator = 0; if (file_check_mem(ms, 0, 1) == -1) return -1; + saved_offset = ms->offset; rv = match(ms, ml.magic, ml.nmagic, b, offset + o, mode, text, flip, indir_count, name_count, printed_something, need_separator, returnval, found_match); + ms->offset = saved_offset; // If the named continuation is empty, then return // true. Otherwise, return the body's 'got_match' value. if (ml.nmagic == 1) { -- 2.20.1 |
|
Fixed, thanks! |
Date Modified | Username | Field | Change |
---|---|---|---|
2020-08-27 19:47 | neal | New Issue | |
2020-08-27 19:47 | neal | File Added: offset.magic | |
2020-08-27 19:47 | neal | File Added: byte.bin | |
2020-08-27 20:27 | neal | Note Added: 0003467 | |
2020-08-28 13:01 | neal | File Added: 0004-Save-ms-offset-around-calls-to-use.patch | |
2020-08-28 13:01 | neal | Note Added: 0003468 | |
2020-09-05 17:17 | christos | Assigned To | => christos |
2020-09-05 17:17 | christos | Status | new => assigned |
2020-09-05 17:17 | christos | Status | assigned => resolved |
2020-09-05 17:17 | christos | Resolution | open => fixed |
2020-09-05 17:17 | christos | Fixed in Version | => 5.40 |
2020-09-05 17:17 | christos | Note Added: 0003477 |