View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000190 | file | General | public | 2020-08-26 13:02 | 2020-09-05 14:58 |
Reporter | neal | Assigned To | christos | ||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | resolved | Resolution | fixed | ||
Fixed in Version | 5.40 | ||||
Summary | 0000190: use always matches | ||||
Description | Consider the following: 0 byte x 1 >0 use foo >>0 byte x 2 0 name foo >0 byte =1 3 I would expect this to print: $ src/file -m /tmp/use.magic /tmp/byte.bin /tmp/byte.bin: 1 But, it does the following: $ src/file -m /tmp/use.magic /tmp/byte.bin /tmp/byte.bin: 1 2 This is because magiccheck (softmagic.c:2240) always returns 1 when determining whether a USE or NAME matched. I have some magic code that finds the start of a block of data and then checks whether the data has the required signature. I wanted to use a 'use foo' to check the data. But, that doesn't work, because the 'use foo' doesn't fail. | ||||
Tags | No tags attached. | ||||
|
|
|
The attached patch fixes the above issue. It changes 'use' to act like the body of the named continuation were pasted in its place. 0002-Change-use-to-only-return-true-if-its-sub-continuati.patch (4,008 bytes)
From 781da068d10f28a9f49a3986700730ad057dce1b Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" <neal@gnu.org> Date: Wed, 26 Aug 2020 22:10:42 +0200 Subject: [PATCH 2/2] Change use to only return true if its sub-continuations match. - Consider the following magic: 0 byte x 1 >0 use foo >>0 byte x 2 0 name foo >0 byte =1 3 - If foo's body does not match, then one could reasonable expect the use's sub-continuations to not be executed. - This is currently not the case. Instead, 'use' is always considered to match. - This patch changes the behavior of 'use' to match that of any sub-continuations. --- src/file.h | 2 +- src/softmagic.c | 28 +++++++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/file.h b/src/file.h index 7298b424..d183b159 100644 --- a/src/file.h +++ b/src/file.h @@ -404,8 +404,8 @@ struct mlist { struct level_info { int32_t off; int got_match; -#ifdef ENABLE_CONDITIONALS int last_match; +#ifdef ENABLE_CONDITIONALS int last_cond; /* used for error checking by parse() */ #endif }; diff --git a/src/softmagic.c b/src/softmagic.c index c27209ad..f3ad21d0 100644 --- a/src/softmagic.c +++ b/src/softmagic.c @@ -52,7 +52,7 @@ private int mget(struct magic_set *, struct magic *, const struct buffer *, uint16_t *, int *, int *, int *, int *); private int msetoffset(struct magic_set *, struct magic *, struct buffer *, const struct buffer *, size_t, unsigned int); -private int magiccheck(struct magic_set *, struct magic *); +private int magiccheck(struct magic_set *, struct magic *, int); private int32_t mprint(struct magic_set *, struct magic *); private int moffset(struct magic_set *, struct magic *, const struct buffer *, int32_t *); @@ -263,7 +263,7 @@ flush: *returnval = 1; } - switch (magiccheck(ms, m)) { + switch (magiccheck(ms, m, cont_level)) { case -1: return -1; case 0: @@ -376,18 +376,14 @@ flush: break; } - switch (flush ? 1 : magiccheck(ms, m)) { + switch (flush ? 1 : magiccheck(ms, m, cont_level)) { case -1: return -1; case 0: -#ifdef ENABLE_CONDITIONALS ms->c->li[cont_level].last_match = 0; -#endif break; default: -#ifdef ENABLE_CONDITIONALS ms->c->li[cont_level].last_match = 1; -#endif if (m->type == FILE_CLEAR) ms->c->li[cont_level].got_match = 0; else if (ms->c->li[cont_level].got_match) { @@ -1577,6 +1573,7 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b, char *rbuf; union VALUETYPE *p = &ms->ms_value; struct mlist ml; + int got_match; if (*indir_count >= ms->indir_max) { file_error(ms, 0, "indirect count (%hu) exceeded", @@ -1891,7 +1888,15 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b, rv = match(ms, ml.magic, ml.nmagic, b, offset + o, mode, text, flip, indir_count, name_count, printed_something, need_separator, returnval, found_match); + // If the named continuation is empty, then return + // true. Otherwise, return the body's 'got_match' value. + if (ml.nmagic == 1) { + got_match = 1; + } else { + got_match = ms->c->li[1].got_match; + } file_continuation_level_pop(ms); + ms->c->li[cont_level].last_match = got_match; (*name_count)--; if (rv != 1) *need_separator = oneed_separator; @@ -1999,7 +2004,7 @@ file_strncmp16(const char *a, const char *b, size_t len, size_t maxlen, } private int -magiccheck(struct magic_set *ms, struct magic *m) +magiccheck(struct magic_set *ms, struct magic *m, int cont_level) { uint64_t l = m->value.q; uint64_t v; @@ -2239,9 +2244,14 @@ magiccheck(struct magic_set *ms, struct magic *m) break; } case FILE_INDIRECT: - case FILE_USE: case FILE_NAME: return 1; + case FILE_USE: + if (ms->c->li[cont_level].last_match) { + return 1; + } else { + return 0; + } case FILE_DER: matched = der_cmp(ms, m); if (matched == -1) { -- 2.20.1 |
|
The above patch should probably only be applied if https://bugs.astron.com/view.php?id=189 is also applied. |
|
Fixed, thanks! |
Date Modified | Username | Field | Change |
---|---|---|---|
2020-08-26 13:02 | neal | New Issue | |
2020-08-26 13:02 | neal | File Added: use.magic | |
2020-08-26 13:02 | neal | File Added: byte.bin | |
2020-08-26 20:30 | neal | File Added: 0002-Change-use-to-only-return-true-if-its-sub-continuati.patch | |
2020-08-26 20:30 | neal | Note Added: 0003465 | |
2020-08-26 20:31 | neal | Note Added: 0003466 | |
2020-09-05 14:58 | christos | Assigned To | => christos |
2020-09-05 14:58 | christos | Status | new => assigned |
2020-09-05 14:58 | christos | Status | assigned => resolved |
2020-09-05 14:58 | christos | Resolution | open => fixed |
2020-09-05 14:58 | christos | Fixed in Version | => 5.40 |
2020-09-05 14:58 | christos | Note Added: 0003476 |