mirror of https://github.com/Cisco-Talos/clamav
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
827 lines
26 KiB
827 lines
26 KiB
diff -ur clamav-orig/clamdtop/clamdtop.c clamav-new/clamdtop/clamdtop.c
|
|
--- clamav-orig/clamdtop/clamdtop.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/clamdtop/clamdtop.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -47,8 +47,10 @@
|
|
#include <arpa/inet.h>
|
|
#include <netinet/in.h>
|
|
#include <sys/socket.h>
|
|
+#ifndef __DJGPP__
|
|
#include <sys/un.h>
|
|
#endif
|
|
+#endif
|
|
#include <sys/time.h>
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
@@ -503,7 +505,7 @@
|
|
int s;
|
|
struct timeval tv;
|
|
conn->tcp = 0;
|
|
-#ifdef _WIN32
|
|
+#if defined(_WIN32) || defined(__DJGPP__)
|
|
{
|
|
#else
|
|
if(soname[0] == '/' || (access(soname, F_OK) == 0)) {
|
|
diff -ur clamav-orig/clamscan/clamscan.c clamav-new/clamscan/clamscan.c
|
|
--- clamav-orig/clamscan/clamscan.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/clamscan/clamscan.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -80,7 +80,7 @@
|
|
}
|
|
#endif
|
|
|
|
-#if !defined(C_WINDOWS) && !defined(C_BEOS)
|
|
+#if !defined(C_WINDOWS) && !defined(C_BEOS) && !defined(__DJGPP__)
|
|
sigemptyset(&sigset);
|
|
sigaddset(&sigset, SIGXFSZ);
|
|
sigprocmask(SIG_SETMASK, &sigset, NULL);
|
|
diff -ur clamav-orig/clamscan/manager.c clamav-new/clamscan/manager.c
|
|
--- clamav-orig/clamscan/manager.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/clamscan/manager.c 2009-03-16 17:15:46.000000000 +1100
|
|
@@ -73,6 +73,11 @@
|
|
#define P_tmpdir "C:\\WINDOWS\\TEMP"
|
|
#endif
|
|
|
|
+#ifdef __DJGPP__
|
|
+#undef P_tmpdir
|
|
+#define P_tmpdir "/dev/env/TEMP"
|
|
+#endif
|
|
+
|
|
#ifndef O_BINARY
|
|
#define O_BINARY 0
|
|
#endif
|
|
@@ -129,7 +134,7 @@
|
|
return 0;
|
|
}
|
|
info.rblocks += fsize / CL_COUNT_PRECISION;
|
|
-#ifndef C_WINDOWS
|
|
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
|
|
if(geteuid())
|
|
if(checkaccess(filename, NULL, R_OK) != 1) {
|
|
if(!printinfected)
|
|
@@ -214,7 +219,7 @@
|
|
|
|
if((dd = opendir(dirname)) != NULL) {
|
|
while((dent = readdir(dd))) {
|
|
-#if !defined(C_INTERIX) && !defined(C_WINDOWS)
|
|
+#if !defined(C_INTERIX) && !defined(C_WINDOWS) && !defined(__DJGPP__)
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -334,7 +339,7 @@
|
|
struct stat sb;
|
|
char *file, cwd[1024], *pua_cats = NULL;
|
|
const struct optstruct *opt;
|
|
-#ifndef C_WINDOWS
|
|
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
|
|
struct rlimit rlim;
|
|
#endif
|
|
|
|
@@ -468,7 +473,7 @@
|
|
}
|
|
}
|
|
|
|
-#ifndef C_WINDOWS
|
|
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
|
|
if(getrlimit(RLIMIT_FSIZE, &rlim) == 0) {
|
|
if(rlim.rlim_max < (rlim_t) cl_engine_get_num(engine, CL_ENGINE_MAX_FILESIZE, NULL))
|
|
logg("^System limit for file size is lower than engine->maxfilesize\n");
|
|
diff -ur clamav-orig/freshclam/freshclam.c clamav-new/freshclam/freshclam.c
|
|
--- clamav-orig/freshclam/freshclam.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/freshclam/freshclam.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -438,7 +438,7 @@
|
|
|
|
logg("#freshclam daemon %s (OS: "TARGET_OS_TYPE", ARCH: "TARGET_ARCH_TYPE", CPU: "TARGET_CPU_TYPE")\n", get_version());
|
|
|
|
-#ifdef C_WINDOWS
|
|
+#if defined(C_WINDOWS) || defined(__DJGPP__)
|
|
signal(SIGINT, daemon_sighandler);
|
|
terminate = 0;
|
|
#else
|
|
diff -ur clamav-orig/freshclam/manager.c clamav-new/freshclam/manager.c
|
|
--- clamav-orig/freshclam/manager.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/freshclam/manager.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -1412,7 +1412,7 @@
|
|
}
|
|
|
|
while((dent = readdir(dir))) {
|
|
-#if !defined(C_INTERIX) && !defined(C_WINDOWS)
|
|
+#if !defined(C_INTERIX) && !defined(C_WINDOWS) && !defined(__DJGPP__)
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
diff -ur clamav-orig/libclamav/binhex.c clamav-new/libclamav/binhex.c
|
|
--- clamav-orig/libclamav/binhex.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/binhex.c 2009-03-16 16:31:12.000000000 +1100
|
|
@@ -119,10 +119,6 @@
|
|
int
|
|
cli_binhex(const char *dir, int desc)
|
|
{
|
|
-#ifndef HAVE_MMAP
|
|
- cli_warnmsg("File not decoded - binhex decoding needs mmap() (for now)\n");
|
|
- return CL_CLEAN;
|
|
-#else
|
|
struct stat statb;
|
|
char *buf, *start, *line;
|
|
size_t size;
|
|
@@ -142,7 +138,11 @@
|
|
if(m == NULL)
|
|
return CL_EMEM;
|
|
|
|
+#ifndef HAVE_MMAP
|
|
+ start = buf = cli_copy_file_to_mem(desc, size, 0);
|
|
+#else
|
|
start = buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, desc, 0);
|
|
+#endif
|
|
if(buf == MAP_FAILED) {
|
|
messageDestroy(m);
|
|
return CL_EMAP;
|
|
@@ -187,7 +187,11 @@
|
|
buf = ++ptr;
|
|
bytesleft--;
|
|
}
|
|
+#ifndef HAVE_MMAP
|
|
+ free(start);
|
|
+#else
|
|
munmap(start, size);
|
|
+#endif
|
|
|
|
if(line)
|
|
free(line);
|
|
@@ -213,5 +217,4 @@
|
|
return CL_CLEAN; /* a lie - but it gets things going */
|
|
/* return CL_EIO; */ /* probably CL_EMEM, but we can't tell at this layer */
|
|
return CL_EMEM;
|
|
-#endif
|
|
}
|
|
diff -ur clamav-orig/libclamav/mbox.c clamav-new/libclamav/mbox.c
|
|
--- clamav-orig/libclamav/mbox.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/mbox.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -3857,7 +3857,7 @@
|
|
int nblanks;
|
|
struct stat statb;
|
|
const char *dentry_idpart;
|
|
-#ifndef C_WINDOWS
|
|
+#if (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino == 0)
|
|
continue;
|
|
#endif
|
|
diff -ur clamav-orig/libclamav/others.c clamav-new/libclamav/others.c
|
|
--- clamav-orig/libclamav/others.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/others.c 2009-03-16 16:37:12.000000000 +1100
|
|
@@ -81,6 +81,47 @@
|
|
#define P_tmpdir "C:\\WINDOWS\\TEMP"
|
|
#endif
|
|
|
|
+#ifdef __DJGPP__
|
|
+#undef P_tmpdir
|
|
+#define P_tmpdir "/dev/env/TEMP"
|
|
+
|
|
+/* DJGPP is missing pread/pwrite */
|
|
+ssize_t pread(int fd, void *data, size_t length, off_t offset )
|
|
+{
|
|
+ ssize_t result;
|
|
+ off_t save_offset;
|
|
+ int save_errno;
|
|
+
|
|
+ save_offset = lseek(fd,offset,SEEK_SET);
|
|
+ if(save_offset==-1) return -1;
|
|
+
|
|
+ result = read(fd,data,length);
|
|
+
|
|
+ save_errno = errno;
|
|
+ lseek(fd, save_offset, SEEK_SET);
|
|
+ errno = save_errno;
|
|
+
|
|
+ return result;
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
+#ifndef HAVE_MMAP
|
|
+/* A partial mmap replacement for binhex and pdf scanning */
|
|
+void *cli_copy_file_to_mem( int fildes, size_t size, off_t offset )
|
|
+{
|
|
+ char *buf = malloc( size );
|
|
+
|
|
+ if( buf == NULL ) return( NULL );
|
|
+ if( pread( fildes, buf, size, offset ) == -1 ) {
|
|
+ free( buf );
|
|
+ return( NULL );
|
|
+ };
|
|
+
|
|
+ return( buf );
|
|
+}
|
|
+#endif
|
|
+
|
|
int (*cli_unrar_open)(int fd, const char *dirname, unrar_state_t *state);
|
|
int (*cli_unrar_extract_next_prepare)(unrar_state_t *state, const char *dirname);
|
|
int (*cli_unrar_extract_next)(unrar_state_t *state, const char *dirname);
|
|
@@ -99,11 +140,19 @@
|
|
}
|
|
rhandle = lt_dlopenext("libclamunrar_iface");
|
|
if (!rhandle) {
|
|
+#ifdef __DJGPP__
|
|
+ cli_unrar_open = unrar_open;
|
|
+ cli_unrar_extract_next_prepare = unrar_extract_next_prepare;
|
|
+ cli_unrar_extract_next = unrar_extract_next;
|
|
+ cli_unrar_close = unrar_close;
|
|
+ have_rar = 1;
|
|
+#else
|
|
#ifdef WARN_DLOPEN_FAIL
|
|
cli_warnmsg("Cannot dlopen: %s - unrar support unavailable\n", lt_dlerror());
|
|
#else
|
|
cli_dbgmsg("Cannot dlopen: %s - unrar support unavailable\n", lt_dlerror());
|
|
#endif
|
|
+#endif
|
|
return;
|
|
}
|
|
if (!(cli_unrar_open = (int(*)(int, const char *, unrar_state_t *))lt_dlsym(rhandle, "unrar_open")) ||
|
|
@@ -597,7 +646,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-#ifdef C_WINDOWS
|
|
+#if defined(C_WINDOWS) || defined(__DJGPP__)
|
|
/*
|
|
* Windows doesn't allow you to delete a directory while it is still open
|
|
*/
|
|
@@ -702,7 +751,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
diff -ur clamav-orig/libclamav/others.h clamav-new/libclamav/others.h
|
|
--- clamav-orig/libclamav/others.h 2009-03-16 11:03:10.000000000 +1100
|
|
+++ clamav-new/libclamav/others.h 2009-03-16 16:31:12.000000000 +1100
|
|
@@ -358,6 +358,11 @@
|
|
void cli_dbgmsg_internal(const char *str, ...);
|
|
#endif
|
|
|
|
+#ifndef HAVE_MMAP
|
|
+void *cli_copy_file_to_mem(int fildes, size_t size, off_t offset);
|
|
+#define MAP_FAILED NULL
|
|
+#endif
|
|
+
|
|
void *cli_malloc(size_t nmemb);
|
|
void *cli_calloc(size_t nmemb, size_t size);
|
|
void *cli_realloc(void *ptr, size_t size);
|
|
diff -ur clamav-orig/libclamav/others_common.c clamav-new/libclamav/others_common.c
|
|
--- clamav-orig/libclamav/others_common.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/others_common.c 2009-03-16 16:44:08.000000000 +1100
|
|
@@ -100,6 +100,221 @@
|
|
fputs(buff, stderr); \
|
|
va_end(args)
|
|
|
|
+#ifdef __DJGPP__
|
|
+/*
|
|
+ * DJGPP is missing strptime (needed by freshclam)
|
|
+ * This is my own implementation
|
|
+ */
|
|
+
|
|
+
|
|
+static char *__day[] = {
|
|
+ "Sunday", "Monday", "Tuesday", "Wednesday",
|
|
+ "Thursday", "Friday", "Saturday"
|
|
+};
|
|
+
|
|
+static char *__month[] = {
|
|
+ "January", "February", "March", "April", "May", "June",
|
|
+ "July", "August", "September", "October", "November", "December"
|
|
+};
|
|
+
|
|
+static char *__ampm[] = {
|
|
+ "AM", "PM"
|
|
+};
|
|
+
|
|
+static int _strton( const char *nptr, const char * restrict *endptr, int max )
|
|
+{
|
|
+ int x = 0;
|
|
+
|
|
+ for( ;; ) {
|
|
+ if( !max ) break;
|
|
+ if( *nptr == '0' && !x ) {
|
|
+ nptr++;
|
|
+ continue;
|
|
+ }
|
|
+ if( isdigit( *nptr ) ) {
|
|
+ x = x * 10 + ( *nptr - '0' );
|
|
+ nptr++;
|
|
+ max--;
|
|
+ } else {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ *endptr = ( char * )nptr;
|
|
+
|
|
+ return( x );
|
|
+}
|
|
+
|
|
+char *strptime( const char * restrict buf, const char * restrict format,
|
|
+ struct tm * restrict tm )
|
|
+{
|
|
+ int w;
|
|
+ char *p;
|
|
+ int stri, len;
|
|
+
|
|
+ while( *format ) {
|
|
+ if( *format == '%' ) {
|
|
+ format++;
|
|
+ if( *format == 'E' || *format == 'O' ) format++;
|
|
+ switch( *format ) {
|
|
+ case '%':
|
|
+ buf++;
|
|
+ break;
|
|
+ case 'a':
|
|
+ case 'A': /* Day of week full or abbreviated */
|
|
+ for( w = 0; w < 7; w++ ) {
|
|
+ p = __day[ w ];
|
|
+ stri = 0;
|
|
+ len = strlen( p );
|
|
+ if( strnicmp( buf, p, len ) == 0 ) stri = len;
|
|
+ else if( strnicmp( buf, p, 3 ) == 0 ) stri = 3;
|
|
+ if( stri != 0 ) {
|
|
+ tm->tm_wday = w;
|
|
+ buf += stri;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ if( w == 7 ) return( NULL );
|
|
+ break;
|
|
+ case 'b':
|
|
+ case 'B':
|
|
+ case 'h':
|
|
+ for( w = 0; w < 12; w++ ) {
|
|
+ p = __month[ w ];
|
|
+ stri = 0;
|
|
+ len = strlen( p );
|
|
+ if( strnicmp( buf, p, len ) == 0 ) stri = len;
|
|
+ else if( strnicmp( buf, p, 3 ) == 0 ) stri = 3;
|
|
+ if( stri != 0 ) {
|
|
+ tm->tm_mon = w;
|
|
+ buf += stri;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ if( w == 12 ) return( NULL );
|
|
+ break;
|
|
+ case 'c':
|
|
+ buf = strptime( buf, "%a %b %d %R:%S %Y", tm );
|
|
+ if( buf == NULL ) return( NULL );
|
|
+ break;
|
|
+ case 'd':
|
|
+ case 'e':
|
|
+ stri = _strton( buf, &buf, 2 );
|
|
+ if( stri == 0 || stri > 31 ) return( NULL );
|
|
+ tm->tm_mday = stri;
|
|
+ break;
|
|
+ case 'D':
|
|
+ if( ( buf = strptime( buf, "%m/%d/%y", tm ) ) == NULL )
|
|
+ return( NULL );
|
|
+ break;
|
|
+ case 'H':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 23 )
|
|
+ return( NULL );
|
|
+ tm->tm_hour = stri;
|
|
+ break;
|
|
+ case 'I':
|
|
+ stri = _strton( buf, &buf, 2 );
|
|
+ if( stri < 1 || stri > 12 ) return( NULL );
|
|
+ tm->tm_hour = stri - 1;
|
|
+ break;
|
|
+ case 'j':
|
|
+ stri = _strton( buf, &buf, 3 );
|
|
+ if( stri < 1 || stri > 366 ) return( NULL );
|
|
+ tm->tm_yday = stri;
|
|
+ break;
|
|
+ case 'm':
|
|
+ stri = _strton( buf, &buf, 2 );
|
|
+ if( stri < 1 || stri > 12 ) return( NULL );
|
|
+ tm->tm_mon = stri - 1;
|
|
+ break;
|
|
+ case 'M':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 59 ) {
|
|
+ return( NULL );
|
|
+ }
|
|
+ tm->tm_min = stri;
|
|
+ break;
|
|
+ case 'n':
|
|
+ case 't':
|
|
+ if( !isspace( *buf ) ) return( NULL );
|
|
+ buf++;
|
|
+ break;
|
|
+ case 'p':
|
|
+ for( w = 0; w < 2; w++ ) {
|
|
+ if( strnicmp( buf, __ampm[ w ], 2 ) == 0 ) break;
|
|
+ }
|
|
+ if( w == 2 ) return( NULL );
|
|
+ if( w == 0 && tm->tm_hour > 11 ) tm->tm_hour -= 12;
|
|
+ if( w == 1 && tm->tm_hour < 12 ) tm->tm_hour += 12;
|
|
+ buf += 2;
|
|
+ break;
|
|
+ case 'r':
|
|
+ if( ( buf = strptime( buf, "%I:%M:%S%p", tm ) ) == NULL )
|
|
+ return( NULL );
|
|
+ break;
|
|
+ case 'R':
|
|
+ if( ( buf = strptime( buf, "%H:%M", tm ) ) == NULL )
|
|
+ return( NULL );
|
|
+ break;
|
|
+ case 'S':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 60 )
|
|
+ return( NULL );
|
|
+ tm->tm_sec = stri;
|
|
+ break;
|
|
+ case 'U':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 53 )
|
|
+ return( NULL );
|
|
+ w = stri * 7;
|
|
+ if( stri % 7 > tm->tm_wday ) w++;
|
|
+ tm->tm_yday = w;
|
|
+ break;
|
|
+ case 'w':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 6 ) return( NULL );
|
|
+ tm->tm_wday = stri;
|
|
+ break;
|
|
+ case 'W':
|
|
+ if( !isdigit( *buf ) ||
|
|
+ ( stri = _strton( buf, &buf, 2 ) ) > 53 )
|
|
+ return( NULL );
|
|
+ w = stri * 7;
|
|
+ if( stri % 7 > ( tm->tm_wday + 6 ) % 7 ) w++;
|
|
+ tm->tm_yday = w;
|
|
+ break;
|
|
+ case 'x':
|
|
+ if( ( buf = strptime( buf, "%a %b %d %Y", tm ) ) == NULL )
|
|
+ return( NULL );
|
|
+ break;
|
|
+ case 'X':
|
|
+ if( ( buf = strptime( buf, "%H:%M:%S", tm ) ) == NULL )
|
|
+ return( NULL );
|
|
+ break;
|
|
+ case 'y':
|
|
+ stri = _strton( buf, &buf, 2 );
|
|
+ if( stri > 99 ) return( NULL );
|
|
+ tm->tm_year = ( stri < 69 ) ? 100 + stri : stri;
|
|
+ break;
|
|
+ case 'Y':
|
|
+ stri = _strton( buf, &buf, 4 );
|
|
+ if( stri < 1969 || stri > 2068 ) return( NULL );
|
|
+ tm->tm_year = stri - 1900;
|
|
+ break;
|
|
+ default:
|
|
+ buf++;
|
|
+ }
|
|
+ } else {
|
|
+ if( isspace( *format ) ) while( isspace( *buf ) ) buf++;
|
|
+ else if( *buf++ != *format ) return( NULL );
|
|
+ }
|
|
+ format++;
|
|
+ }
|
|
+
|
|
+ return( ( char * )buf );
|
|
+}
|
|
+#endif
|
|
+
|
|
void cli_warnmsg(const char *str, ...)
|
|
{
|
|
MSGCODE("LibClamAV Warning: ");
|
|
@@ -753,7 +968,12 @@
|
|
int i;
|
|
|
|
if(!dir) {
|
|
- if((mdir = getenv("TMPDIR")) == NULL)
|
|
+ mdir = getenv("TMPDIR");
|
|
+#ifdef __DJGPP__
|
|
+ if( mdir == NULL ) mdir = getenv("TEMP");
|
|
+ if( mdir == NULL ) mdir = getenv("TMP");
|
|
+#endif
|
|
+ if(mdir == NULL)
|
|
#ifdef P_tmpdir
|
|
mdir = P_tmpdir;
|
|
#else
|
|
@@ -789,12 +1009,17 @@
|
|
return NULL;
|
|
}
|
|
|
|
+#ifdef __DJGPP__ /* Support systems that don't have an lfn driver/interface */
|
|
+ sprintf(name, "%s/c", mdir);
|
|
+ strncat(name, tmp, 7);
|
|
+#else
|
|
#ifdef C_WINDOWS
|
|
sprintf(name, "%s\\clamav-", mdir);
|
|
#else
|
|
sprintf(name, "%s/clamav-", mdir);
|
|
#endif
|
|
strncat(name, tmp, 32);
|
|
+#endif
|
|
free(tmp);
|
|
|
|
return(name);
|
|
diff -ur clamav-orig/libclamav/pdf.c clamav-new/libclamav/pdf.c
|
|
--- clamav-orig/libclamav/pdf.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/pdf.c 2009-03-16 16:31:12.000000000 +1100
|
|
@@ -26,7 +26,6 @@
|
|
#include "clamav-config.h"
|
|
#endif
|
|
|
|
-#ifdef HAVE_MMAP
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
@@ -105,7 +104,11 @@
|
|
if(size <= 7) /* doesn't even include the file header */
|
|
return CL_CLEAN;
|
|
|
|
+#ifndef HAVE_MMAP
|
|
+ p = buf = cli_copy_file_to_mem(desc, size, offset);
|
|
+#else
|
|
p = buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, desc, offset);
|
|
+#endif
|
|
if(buf == MAP_FAILED) {
|
|
cli_errmsg("cli_pdf: mmap() failed\n");
|
|
return CL_EMAP;
|
|
@@ -126,7 +129,11 @@
|
|
}
|
|
|
|
if(!bytesleft) {
|
|
+#ifndef HAVE_MMAP
|
|
+ free(buf);
|
|
+#else
|
|
munmap(buf, size);
|
|
+#endif
|
|
cli_dbgmsg("cli_pdf: file header not found\n");
|
|
return CL_CLEAN;
|
|
}
|
|
@@ -137,7 +144,11 @@
|
|
break;
|
|
|
|
if(q <= p) {
|
|
+#ifndef HAVE_MMAP
|
|
+ free(buf);
|
|
+#else
|
|
munmap(buf, size);
|
|
+#endif
|
|
cli_dbgmsg("cli_pdf: trailer not found\n");
|
|
return CL_CLEAN;
|
|
}
|
|
@@ -156,7 +167,11 @@
|
|
* http://www.cs.cmu.edu/~dst/Adobe/Gallery/anon21jul01-pdf-encryption.txt
|
|
* http://www.adobe.com/devnet/pdf/
|
|
*/
|
|
+#ifndef HAVE_MMAP
|
|
+ free(buf);
|
|
+#else
|
|
munmap(buf, size);
|
|
+#endif
|
|
cli_dbgmsg("cli_pdf: Encrypted PDF files not yet supported\n");
|
|
return CL_CLEAN;
|
|
}
|
|
@@ -179,7 +194,11 @@
|
|
break;
|
|
|
|
if(xrefstart == p) {
|
|
+#ifndef HAVE_MMAP
|
|
+ free(buf);
|
|
+#else
|
|
munmap(buf, size);
|
|
+#endif
|
|
cli_dbgmsg("cli_pdf: xref not found\n");
|
|
return CL_CLEAN;
|
|
}
|
|
@@ -550,7 +569,11 @@
|
|
if(rc != CL_CLEAN) break;
|
|
}
|
|
|
|
+#ifndef HAVE_MMAP
|
|
+ free(buf);
|
|
+#else
|
|
munmap(buf, size);
|
|
+#endif
|
|
|
|
tableDestroy(md5table);
|
|
|
|
@@ -886,16 +909,4 @@
|
|
|
|
return NULL;
|
|
}
|
|
-#else /*!HAVE_MMAP*/
|
|
-
|
|
-#include "clamav.h"
|
|
-#include "others.h"
|
|
-#include "pdf.h"
|
|
|
|
-int
|
|
-cli_pdf(const char *dir, int desc, cli_ctx *ctx, off_t offset)
|
|
-{
|
|
- cli_dbgmsg("File not decoded - PDF decoding needs mmap() (for now)\n");
|
|
- return CL_CLEAN;
|
|
-}
|
|
-#endif
|
|
diff -ur clamav-orig/libclamav/readdb.c clamav-new/libclamav/readdb.c
|
|
--- clamav-orig/libclamav/readdb.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/readdb.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -1605,7 +1605,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1719,7 +1719,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1802,7 +1802,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1909,6 +1909,16 @@
|
|
#ifdef CL_THREAD_SAFE
|
|
pthread_mutex_unlock(&cli_ref_mutex);
|
|
#endif
|
|
+/*
|
|
+ * I know that disabling this for DJGPP causes a GIANT memory leak if an app
|
|
+ * were to free the database and load it again, but if we let if free each
|
|
+ * tiny memory block, it literally takes at least 5-10min if not more to
|
|
+ * finish. And in DOS all of the memory will automatically be freed when
|
|
+ * the app terminates, so the leak isn't permanent. If mempool were to be
|
|
+ * available for systems without mmap, this would likely be a much better
|
|
+ * solution
|
|
+ */
|
|
+#ifndef __DJGPP__
|
|
if(engine->root) {
|
|
for(i = 0; i < CLI_MTARGETS; i++) {
|
|
if((root = engine->root[i])) {
|
|
@@ -1981,6 +1991,7 @@
|
|
|
|
cli_ftfree(engine);
|
|
cli_freeign(engine);
|
|
+#endif
|
|
#ifdef USE_MPOOL
|
|
if(engine->mempool) mpool_destroy(engine->mempool);
|
|
#endif
|
|
diff -ur clamav-orig/libclamav/scanners.c clamav-new/libclamav/scanners.c
|
|
--- clamav-orig/libclamav/scanners.c 2009-03-16 11:37:28.000000000 +1100
|
|
+++ clamav-new/libclamav/scanners.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -128,7 +128,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -885,7 +885,7 @@
|
|
#else
|
|
while((dent = readdir(dd))) {
|
|
#endif
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
diff -ur clamav-orig/shared/actions.c clamav-new/shared/actions.c
|
|
--- clamav-orig/shared/actions.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/shared/actions.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -30,7 +30,9 @@
|
|
#include <fcntl.h>
|
|
#include <utime.h>
|
|
#include <errno.h>
|
|
+#ifndef __DJGPP__
|
|
#include <libgen.h>
|
|
+#endif
|
|
|
|
#include "shared/optparser.h"
|
|
#include "shared/output.h"
|
|
diff -ur clamav-orig/shared/misc.h clamav-new/shared/misc.h
|
|
--- clamav-orig/shared/misc.h 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/shared/misc.h 2009-03-16 17:13:22.000000000 +1100
|
|
@@ -23,6 +23,7 @@
|
|
#include <netdb.h>
|
|
#include <netinet/in.h>
|
|
#include "optparser.h"
|
|
+
|
|
/* Maximum filenames under various systems - njh */
|
|
#ifndef NAME_MAX /* e.g. Linux */
|
|
# ifdef MAXNAMELEN /* e.g. Solaris */
|
|
diff -ur clamav-orig/shared/optparser.c clamav-new/shared/optparser.c
|
|
--- clamav-orig/shared/optparser.c 2009-03-16 11:48:00.000000000 +1100
|
|
+++ clamav-new/shared/optparser.c 2009-03-16 17:21:28.000000000 +1100
|
|
@@ -56,13 +56,19 @@
|
|
#define FLAG_REQUIRED 2 /* arg is required, even if there's a default value */
|
|
#define FLAG_HIDDEN 4 /* don't print in clamconf --generate-config */
|
|
|
|
+#ifdef __DJGPP__
|
|
+#define FRESHCLAM_CONF CONFDIR"/clamav.cnf"
|
|
+#else
|
|
+#define FRESHCLAM_CONF CONFDIR"/freshclam.conf"
|
|
+#endif
|
|
+
|
|
const struct clam_option clam_options[] = {
|
|
/* name, longopt, sopt, argtype, regex, num, str, mul, owner, description, suggested */
|
|
|
|
/* cmdline only */
|
|
{ NULL, "help", 'h', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_CLAMDSCAN | OPT_SIGTOOL | OPT_MILTER | OPT_CLAMCONF | OPT_CLAMDTOP, "", "" },
|
|
{ NULL, "config-file", 'c', TYPE_STRING, NULL, 0, CONFDIR"/clamd.conf", FLAG_REQUIRED, OPT_CLAMD | OPT_CLAMDSCAN | OPT_CLAMDTOP, "", "" },
|
|
- { NULL, "config-file", 0, TYPE_STRING, NULL, 0, CONFDIR"/freshclam.conf", FLAG_REQUIRED, OPT_FRESHCLAM, "", "" },
|
|
+ { NULL, "config-file", 0, TYPE_STRING, NULL, 0, FRESHCLAM_CONF, FLAG_REQUIRED, OPT_FRESHCLAM, "", "" },
|
|
{ NULL, "config-file", 'c', TYPE_STRING, NULL, 0, CONFDIR"/clamav-milter.conf", FLAG_REQUIRED, OPT_MILTER, "", "" },
|
|
{ NULL, "version", 'V', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_CLAMDSCAN | OPT_SIGTOOL | OPT_MILTER | OPT_CLAMCONF | OPT_CLAMDTOP, "", "" },
|
|
{ NULL, "debug", 0, TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_SIGTOOL, "", "" },
|
|
diff -ur clamav-orig/sigtool/sigtool.c clamav-new/sigtool/sigtool.c
|
|
--- clamav-orig/sigtool/sigtool.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/sigtool/sigtool.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -35,7 +35,9 @@
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <sys/socket.h>
|
|
+#ifndef __DJGPP__
|
|
#include <sys/un.h>
|
|
+#endif
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <sys/wait.h>
|
|
@@ -987,7 +989,7 @@
|
|
}
|
|
|
|
while((dent = readdir(dd))) {
|
|
-#ifndef C_INTERIX
|
|
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1469,7 +1471,7 @@
|
|
}
|
|
|
|
while((dent = readdir(dd))) {
|
|
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
|
|
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1617,7 +1619,7 @@
|
|
}
|
|
|
|
while((dent = readdir(dd))) {
|
|
-#ifndef C_INTERIX
|
|
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
@@ -1645,7 +1647,7 @@
|
|
}
|
|
|
|
while((dent = readdir(dd))) {
|
|
-#ifndef C_INTERIX
|
|
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
|
|
if(dent->d_ino)
|
|
#endif
|
|
{
|
|
diff -ur clamav-orig/sigtool/vba.c clamav-new/sigtool/vba.c
|
|
--- clamav-orig/sigtool/vba.c 2009-03-16 11:37:26.000000000 +1100
|
|
+++ clamav-new/sigtool/vba.c 2009-03-16 16:30:26.000000000 +1100
|
|
@@ -970,7 +970,10 @@
|
|
|
|
if ((dd = opendir (dirname)) != NULL) {
|
|
while ((dent = readdir (dd))) {
|
|
- if (dent->d_ino) {
|
|
+#ifndef __DJGPP__
|
|
+ if (dent->d_ino)
|
|
+#endif
|
|
+ {
|
|
if (strcmp (dent->d_name, ".") && strcmp (dent->d_name, "..")) {
|
|
/* build the full name */
|
|
fname = (char *) cli_calloc (strlen (dirname) + strlen (dent->d_name) + 2, sizeof (char));
|
|
@@ -1130,7 +1133,10 @@
|
|
|
|
if ((dd = opendir (dirname)) != NULL) {
|
|
while ((dent = readdir (dd))) {
|
|
- if (dent->d_ino) {
|
|
+#ifndef __DJGPP__
|
|
+ if (dent->d_ino)
|
|
+#endif
|
|
+ {
|
|
if (strcmp (dent->d_name, ".") && strcmp (dent->d_name, "..")) {
|
|
/* build the full name */
|
|
fullname = calloc (strlen (dirname) + strlen (dent->d_name) + 2, sizeof (char));
|
|
|