- Handle freeing of magic in one place.
- Fix memory leak.
#endif
#ifndef lint
-FILE_RCSID("@(#)$Id: apprentice.c,v 1.64 2003/09/12 19:39:44 christos Exp $")
+FILE_RCSID("@(#)$Id: apprentice.c,v 1.65 2003/10/08 16:37:27 christos Exp $")
#endif /* lint */
#define EATAB {while (isascii((unsigned char) *l) && \
#define MAP_FILE 0
#endif
-#ifdef __EMX__
- char PATHSEP=';';
-#else
- char PATHSEP=':';
-#endif
-
-
private int getvalue(struct magic_set *ms, struct magic *, char **);
private int hextoint(int);
private char *getstr(struct magic_set *, char *, char *, int, int *);
mapped = rv;
if ((ml = malloc(sizeof(*ml))) == NULL) {
+ file_delmagic(magic, mapped, nmagic);
file_oomem(ms);
return -1;
}
- if (magic == NULL || nmagic == 0)
+ if (magic == NULL || nmagic == 0) {
+ file_delmagic(magic, mapped, nmagic);
return -1;
+ }
ml->magic = magic;
ml->nmagic = nmagic;
#endif /* COMPILE_ONLY */
}
+protected void
+file_delmagic(struct magic *p, int type, size_t entries)
+{
+ if (p == NULL)
+ return;
+ switch (type) {
+ case 2:
+ p--;
+ (void)munmap(p, sizeof(*p) * (entries + 1));
+ break;
+ case 1:
+ p--;
+ case 0:
+ free(p);
+ break;
+ default:
+ abort();
+ }
+}
+
/* const char *fn: list of magic files */
protected struct mlist *
file_apprentice(struct magic_set *ms, const char *fn, int action)
{
- char *p, *mfn;
+ char *p, *mfn, *afn = NULL;
int file_err, errs = -1;
struct mlist *mlist;
+ if (fn == NULL)
+ fn = getenv("MAGIC");
+ if (fn == NULL)
+ fn = MAGIC;
+
if ((fn = mfn = strdup(fn)) == NULL) {
file_oomem(ms);
return NULL;
}
+
if ((mlist = malloc(sizeof(*mlist))) == NULL) {
free(mfn);
file_oomem(ms);
p = strchr(fn, PATHSEP);
if (p)
*p++ = '\0';
+ if (*fn == '\0')
+ break;
+ if (ms->flags & MAGIC_MIME) {
+ if ((afn = malloc(strlen(fn) + 5 + 1)) == NULL) {
+ free(mfn);
+ free(mlist);
+ file_oomem(ms);
+ return NULL;
+ }
+ (void)strcpy(afn, fn);
+ (void)strcat(afn, ".mime");
+ fn = afn;
+ }
file_err = apprentice_1(ms, fn, action, mlist);
if (file_err > errs)
errs = file_err;
+ if (afn) {
+ free(afn);
+ afn = NULL;
+ }
fn = p;
}
if (errs == -1) {
file_error(ms, "Couldn't find any magic files!");
return NULL;
}
- free(mfn);
return mlist;
}
#include "patchlevel.h"
#ifndef lint
-FILE_RCSID("@(#)$Id: file.c,v 1.81 2003/09/12 19:39:44 christos Exp $")
+FILE_RCSID("@(#)$Id: file.c,v 1.82 2003/10/08 16:37:27 christos Exp $")
#endif /* lint */
# define USAGE "Usage: %s [-bcik" SYMLINKFLAG "nNsvz] [-f namefile] [-F separator] [-m magicfiles] file...\n %s -C -m magicfiles\n"
-#ifndef MAGIC
-# define MAGIC "/etc/magic"
-#endif
-
#ifndef MAXPATHLEN
#define MAXPATHLEN 512
#endif
bflag = 0, /* brief output format */
nopad = 0, /* Don't pad output */
nobuffer = 0, /* Do not buffer stdout */
- kflag = 0, /* Keep going after the first match */
- rflag = 0; /* Restore access times of files */
+ kflag = 0; /* Keep going after the first match */
private const char *magicfile = 0; /* where the magic is */
private const char *default_magicfile = MAGIC;
break;
case 'i':
flags |= MAGIC_MIME;
- if ((mime = malloc(strlen(magicfile) + 6)) != NULL) {
- (void)strcpy(mime, magicfile);
- (void)strcat(mime, ".mime");
- magicfile = mime;
- }
break;
case 'k':
kflag = 1;
*/
/*
* file.h - definitions for file(1) program
- * @(#)$Id: file.h,v 1.56 2003/09/12 19:07:25 christos Exp $
+ * @(#)$Id: file.h,v 1.57 2003/10/08 16:37:27 christos Exp $
*/
#ifndef __file_h__
/* Do this here and now, because struct stat gets re-defined on solaris */
#include <sys/stat.h>
+#ifndef MAGIC
+#define MAGIC "/etc/magic"
+#endif
+
+#ifdef __EMX__
+#define PATHSEP ';'
+#else
+#define PATHSEP ':'
+#endif
#define private static
#ifndef protected
#define VERSIONNO 2
#define FILE_MAGICSIZE (32 * 4)
+#define FILE_LOAD 0
#define FILE_CHECK 1
#define FILE_COMPILE 2
protected int file_softmagic(struct magic_set *, const unsigned char *, size_t);
protected struct mlist *file_apprentice(struct magic_set *, const char *, int);
protected uint32_t file_signextend(struct magic_set *, struct magic *, uint32_t);
+protected void file_delmagic(struct magic *, int type, size_t entries);
protected void file_badread(struct magic_set *);
protected void file_badseek(struct magic_set *);
protected void file_oomem(struct magic_set *);
#include "patchlevel.h"
#ifndef lint
-FILE_RCSID("@(#)$Id: magic.c,v 1.10 2003/07/10 21:07:14 christos Exp $")
+FILE_RCSID("@(#)$Id: magic.c,v 1.11 2003/10/08 16:37:27 christos Exp $")
#endif /* lint */
#ifdef __EMX__
const void *buf, size_t nb);
#endif /* __EMX__ */
-#ifndef MAGIC
-# define MAGIC "/etc/magic"
-#endif
-
private void free_mlist(struct mlist *);
private void close_and_restore(const struct magic_set *, const char *, int,
const struct stat *);
return ms;
}
-/*
- * load a magic file
- */
-public int
-magic_load(struct magic_set *ms, const char *magicfile)
-{
- struct mlist *ml;
-
- if (magicfile == NULL)
- magicfile = (ms->flags & MAGIC_MIME) ? MAGIC ".mime" : MAGIC;
-
- ml = file_apprentice(ms, magicfile, 0);
- if (ml == NULL)
- return -1;
- free_mlist(ms->mlist);
- ms->mlist = ml;
- return 0;
-}
-
private void
free_mlist(struct mlist *mlist)
{
for (ml = mlist->next; ml != mlist;) {
struct mlist *next = ml->next;
struct magic *mg = ml->magic;
- switch (ml->mapped) {
- case 0:
- free(mg);
- break;
- case 1:
- mg--;
- free(mg);
- break;
- case 2:
- mg--;
- (void)munmap(mg, sizeof(*mg) * (ml->nmagic + 1));
- break;
- }
+ file_delmagic(mg, ml->mapped, ml->nmagic);
free(ml);
ml = next;
}
free(ms);
}
+/*
+ * load a magic file
+ */
+public int
+magic_load(struct magic_set *ms, const char *magicfile)
+{
+ struct mlist *ml = file_apprentice(ms, magicfile, FILE_LOAD);
+ if (ml) {
+ free_mlist(ms->mlist);
+ ms->mlist = ml;
+ return 0;
+ }
+ return -1;
+}
+
public int
magic_compile(struct magic_set *ms, const char *magicfile)
{
struct mlist *ml = file_apprentice(ms, magicfile, FILE_COMPILE);
- if(ml == NULL)
- return -1;
free_mlist(ml);
return ml ? 0 : -1;
}
magic_check(struct magic_set *ms, const char *magicfile)
{
struct mlist *ml = file_apprentice(ms, magicfile, FILE_CHECK);
- if(ml == NULL)
- return -1;
free_mlist(ml);
return ml ? 0 : -1;
}