mirror of https://github.com/Cisco-Talos/clamav
parent
4d4166a9f2
commit
a7f5fd00f5
@ -0,0 +1,97 @@ |
||||
/*
|
||||
* is_tar() -- figure out whether file is a tar archive. |
||||
* |
||||
* Stolen (by the author of the file utility!) from the public domain tar program: |
||||
* Public Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu). |
||||
* |
||||
* @(#)list.c 1.18 9/23/86 Public Domain - gnu |
||||
* $Id: is_tar.c,v 1.1 2005/03/22 21:26:25 kojm Exp $ |
||||
* |
||||
* Comments changed and some code/comments reformatted |
||||
* for file command by Ian Darwin. |
||||
*/ |
||||
|
||||
#if HAVE_CONFIG_H |
||||
#include "clamav-config.h" |
||||
#endif |
||||
|
||||
#include <string.h> |
||||
#include <ctype.h> |
||||
#include <sys/types.h> |
||||
#include "is_tar.h" |
||||
|
||||
#include "others.h" |
||||
|
||||
#define isodigit(c) ( ((c) >= '0') && ((c) <= '7') ) |
||||
|
||||
static int from_oct(int digs, char *where); |
||||
|
||||
/*
|
||||
* Return
|
||||
* 0 if the checksum is bad (i.e., probably not a tar archive),
|
||||
* 1 for old UNIX tar file, |
||||
* 2 for Unix Std (POSIX) tar file. |
||||
*/ |
||||
int is_tar(unsigned char *buf, int nbytes) |
||||
{ |
||||
union record *header = (union record *)buf; |
||||
int i; |
||||
int sum, recsum; |
||||
char *p; |
||||
|
||||
|
||||
if (nbytes < sizeof(union record)) |
||||
return 0; |
||||
|
||||
recsum = from_oct(8, header->header.chksum); |
||||
|
||||
sum = 0; |
||||
p = header->charptr; |
||||
for (i = sizeof(union record); --i >= 0;) { |
||||
/*
|
||||
* We can't use unsigned char here because of old compilers, |
||||
* e.g. V7. |
||||
*/ |
||||
sum += 0xFF & *p++; |
||||
} |
||||
|
||||
/* Adjust checksum to count the "chksum" field as blanks. */ |
||||
for (i = sizeof(header->header.chksum); --i >= 0;) |
||||
sum -= 0xFF & header->header.chksum[i]; |
||||
sum += ' '* sizeof header->header.chksum;
|
||||
|
||||
if (sum != recsum) |
||||
return 0; /* Not a tar archive */ |
||||
|
||||
if (0==strcmp(header->header.magic, TMAGIC)) |
||||
return 2; /* Unix Standard tar archive */ |
||||
|
||||
return 1; /* Old fashioned tar archive */ |
||||
} |
||||
|
||||
|
||||
/*
|
||||
* Quick and dirty octal conversion. |
||||
* |
||||
* Result is -1 if the field is invalid (all blank, or nonoctal). |
||||
*/ |
||||
static int from_oct(int digs, char *where) |
||||
{ |
||||
int value; |
||||
|
||||
while (isspace((unsigned char)*where)) { /* Skip spaces */ |
||||
where++; |
||||
if (--digs <= 0) |
||||
return -1; /* All blank field */ |
||||
} |
||||
value = 0; |
||||
while (digs > 0 && isodigit(*where)) { /* Scan til nonoctal */ |
||||
value = (value << 3) | (*where++ - '0'); |
||||
--digs; |
||||
} |
||||
|
||||
if (digs > 0 && *where && !isspace((unsigned char)*where)) |
||||
return -1; /* Ended on non-space/nul */ |
||||
|
||||
return value; |
||||
} |
@ -0,0 +1,45 @@ |
||||
/*
|
||||
* Header file for public domain tar (tape archive) program. |
||||
* |
||||
* @(#)tar.h 1.20 86/10/29 Public Domain. |
||||
* |
||||
* Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu. |
||||
* |
||||
* $Id: is_tar.h,v 1.1 2005/03/22 21:26:25 kojm Exp $ # checkin only |
||||
*/ |
||||
|
||||
/*
|
||||
* Header block on tape. |
||||
* |
||||
* I'm going to use traditional DP naming conventions here. |
||||
* A "block" is a big chunk of stuff that we do I/O on. |
||||
* A "record" is a piece of info that we care about. |
||||
* Typically many "record"s fit into a "block". |
||||
*/ |
||||
#define RECORDSIZE 512 |
||||
#define NAMSIZ 100 |
||||
#define TUNMLEN 32 |
||||
#define TGNMLEN 32 |
||||
|
||||
union record { |
||||
char charptr[RECORDSIZE]; |
||||
struct header { |
||||
char name[NAMSIZ]; |
||||
char mode[8]; |
||||
char uid[8]; |
||||
char gid[8]; |
||||
char size[12]; |
||||
char mtime[12]; |
||||
char chksum[8]; |
||||
char linkflag; |
||||
char linkname[NAMSIZ]; |
||||
char magic[8]; |
||||
char uname[TUNMLEN]; |
||||
char gname[TGNMLEN]; |
||||
char devmajor[8]; |
||||
char devminor[8]; |
||||
} header; |
||||
}; |
||||
|
||||
/* The magic field is filled with this if uname and gname are valid. */ |
||||
#define TMAGIC "ustar " /* 7 chars and a null */ |
Loading…
Reference in new issue