Skip to content

Commit

Permalink
Need to pass the returnval that the child match determined in the use…
Browse files Browse the repository at this point in the history
… case.

This broke the elf mime printing, where softmagic returned a non-match although
the child match() actually printed something.
  • Loading branch information
zoulasc committed Jan 4, 2013
1 parent 6871c4e commit b8bdbeb
Showing 1 changed file with 22 additions and 16 deletions.
38 changes: 22 additions & 16 deletions src/softmagic.c
Expand Up @@ -32,7 +32,7 @@
#include "file.h"

#ifndef lint
FILE_RCSID("@(#)$File: softmagic.c,v 1.155 2012/11/01 04:21:27 christos Exp $")
FILE_RCSID("@(#)$File: softmagic.c,v 1.156 2013/01/03 23:11:38 christos Exp $")
#endif /* lint */

#include "magic.h"
Expand All @@ -43,9 +43,9 @@ FILE_RCSID("@(#)$File: softmagic.c,v 1.155 2012/11/01 04:21:27 christos Exp $")


private int match(struct magic_set *, struct magic *, uint32_t,
const unsigned char *, size_t, size_t, int, int, int);
const unsigned char *, size_t, size_t, int, int, int, int *);
private int mget(struct magic_set *, const unsigned char *,
struct magic *, size_t, size_t, unsigned int, int, int, int);
struct magic *, size_t, size_t, unsigned int, int, int, int, int *);
private int magiccheck(struct magic_set *, struct magic *);
private int32_t mprint(struct magic_set *, struct magic *);
private int32_t moffset(struct magic_set *, struct magic *);
Expand Down Expand Up @@ -73,7 +73,7 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes,
int rv;
for (ml = ms->mlist[0]->next; ml != ms->mlist[0]; ml = ml->next)
if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, 0, mode,
text, 0)) != 0)
text, 0, NULL)) != 0)
return rv;

return 0;
Expand Down Expand Up @@ -109,16 +109,19 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes,
private int
match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
const unsigned char *s, size_t nbytes, size_t offset, int mode, int text,
int flip)
int flip, int *returnval)
{
uint32_t magindex = 0;
unsigned int cont_level = 0;
int need_separator = 0;
int returnval = 0, e; /* if a match is found it is set to 1*/
int returnvalv = 0, e; /* if a match is found it is set to 1*/
int firstline = 1; /* a flag to print X\n X\n- X */
int printed_something = 0;
int print = (ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0;

if (returnval == NULL)
returnval = &returnvalv;

if (file_check_mem(ms, cont_level) == -1)
return -1;

Expand All @@ -144,15 +147,15 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,

/* if main entry matches, print it... */
switch (mget(ms, s, m, nbytes, offset, cont_level, mode, text,
flip)) {
flip, returnval)) {
case -1:
return -1;
case 0:
flush = m->reln != '!';
break;
default:
if (m->type == FILE_INDIRECT)
returnval = 1;
*returnval = 1;

switch (magiccheck(ms, m)) {
case -1:
Expand All @@ -178,6 +181,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
}

if ((e = handle_annotation(ms, m)) != 0) {
*returnval = 1;
return e;
}
/*
Expand Down Expand Up @@ -229,7 +233,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
}
#endif
switch (mget(ms, s, m, nbytes, offset, cont_level, mode,
text, flip)) {
text, flip, returnval)) {
case -1:
return -1;
case 0:
Expand All @@ -239,7 +243,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
break;
default:
if (m->type == FILE_INDIRECT)
returnval = 1;
*returnval = 1;
flush = 0;
break;
}
Expand All @@ -262,8 +266,10 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
ms->c.li[cont_level].got_match = 0;
break;
}
if ((e = handle_annotation(ms, m)) != 0)
if ((e = handle_annotation(ms, m)) != 0) {
*returnval = 1;
return e;
}
/*
* If we are going to print something,
* make sure that we have a separator first.
Expand Down Expand Up @@ -312,13 +318,13 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
if (printed_something) {
firstline = 0;
if (print)
returnval = 1;
*returnval = 1;
}
if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) {
return returnval; /* don't keep searching */
return *returnval; /* don't keep searching */
}
}
return returnval; /* This is hit if -k is set or there is no match */
return *returnval; /* This is hit if -k is set or there is no match */
}

private int
Expand Down Expand Up @@ -1110,7 +1116,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
private int
mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
size_t nbytes, size_t o, unsigned int cont_level, int mode, int text,
int flip)
int flip, int *returnval)
{
uint32_t offset = ms->offset;
uint32_t count = m->str_range;
Expand Down Expand Up @@ -1713,7 +1719,7 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
return -1;
}
return match(ms, ml.magic, ml.nmagic, s, nbytes, offset,
mode, text, flip);
mode, text, flip, returnval);

case FILE_NAME:
if (file_printf(ms, "%s", m->desc) == -1)
Expand Down

0 comments on commit b8bdbeb

Please sign in to comment.