[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
aCaB
acab at clamav.net
Sun Apr 4 01:07:38 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit 8618abc1d31a3a57fb5bb942fee241faa77c9091
Author: aCaB <acab at clamav.net>
Date: Sat Oct 10 19:10:15 2009 +0200
fmap: win32 support and tidy
diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index f4db164..704ad95 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -41,6 +41,10 @@
#include "others.h"
#include "cltypes.h"
+
+#ifndef __WIN32
+/* vvvvv POSIX STUFF BELOW vvvvv */
+
#define FM_MASK_COUNT 0x3fffffff
#define FM_MASK_PAGED 0x40000000
#define FM_MASK_SEEN 0x80000000
@@ -118,6 +122,7 @@ fmap_t *fmap(int fd, off_t offset, size_t len) {
cli_warnmsg("fmap: attempted oof mapping\n");
return NULL;
}
+
pages = fmap_align_items(len, pgsz);
hdrsz = fmap_align_to(sizeof(fmap_t) + (pages-1) * sizeof(uint32_t), pgsz); /* fmap_t includes 1 bitmap slot, hence (pages-1) */
mapsz = pages * pgsz + hdrsz;
@@ -151,13 +156,6 @@ fmap_t *fmap(int fd, off_t offset, size_t len) {
m->hdrsz = hdrsz;
m->pgsz = pgsz;
m->paged = 0;
-#ifdef FMAPDEBUG
- m->page_needs = 0;
- m->page_reads = 0;
- m->page_locks = 0;
- m->page_unlocks = 0;
- m->page_unmaps = 0;
-#endif
return m;
}
@@ -204,9 +202,6 @@ static void fmap_aging(fmap_t *m) {
fmap_unlock;
}
m->paged -= avail;
-#ifdef FMAPDEBUG
- m->page_unmaps += avail;
-#endif
}
}
#endif
@@ -227,10 +222,6 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
faultme = ((char *)m)[(first_page+i) * m->pgsz + m->hdrsz];
}
fmap_unlock;
-#ifdef FMAPDEBUG
- m->page_needs += count;
- m->page_locks += lock_count;
-#endif
for(i=0; i<=count; i++, page++) {
int lock;
if(lock_count) {
@@ -290,9 +281,6 @@ static int fmap_readpage(fmap_t *m, unsigned int first_page, unsigned int count,
cli_warnmsg("pread fail: page %u pages %u map-offset %lu - asked for %lu bytes, got %lu\n", first_page, m->pages, (long unsigned int)m->offset, (long unsigned int)readsz, (long unsigned int)got);
return 1;
}
-#ifdef FMAPDEBUG
- m->page_reads += count;
-#endif
pptr = NULL;
force_read = 0;
readsz = 0;
@@ -361,7 +349,6 @@ void *fmap_need_ptr(fmap_t *m, void *ptr, size_t len) {
void *fmap_need_ptr_once(fmap_t *m, void *ptr, size_t len) {
return fmap_need_off_once(m, (char *)ptr - (char *)m - m->hdrsz, len);
}
-
void *fmap_need_str(fmap_t *m, void *ptr, size_t len_hint) {
size_t at = (char *)ptr - (char *)m - m->hdrsz;
return fmap_need_offstr(m, at, len_hint);
@@ -373,9 +360,6 @@ static void fmap_unneed_page(fmap_t *m, unsigned int page) {
if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == (FM_MASK_PAGED | FM_MASK_LOCKED)) {
/* page is paged and locked: check lock count */
s &= FM_MASK_COUNT;
-#ifdef FMAPDEBUG
- m->page_unlocks ++;
-#endif
if(s > 1) /* locked more than once: dec lock count */
fmap_bitmap[page]--;
else if (s == 1) /* only one lock left: unlock and begin aging */
@@ -413,25 +397,7 @@ void fmap_unneed_ptr(fmap_t *m, void *ptr, size_t len) {
fmap_unneed_off(m, (char *)ptr - (char *)m - m->hdrsz, len);
}
-int fmap_readn(fmap_t *m, void *dst, size_t at, size_t len) {
- char *src;
-
- if(at > m->len)
- return -1;
- if(len > m->len - at)
- len = m->len - at;
- src = fmap_need_off_once(m, at, len);
- if(!src)
- return -1;
- memcpy(dst, src, len);
- return len;
-}
-
void funmap(fmap_t *m) {
-#ifdef FMAPDEBUG
- cli_errmsg("FMAPDEBUG: Needs:%u reads:%u locks:%u unlocks:%u unmaps:%u\n", m->page_needs, m->page_reads, m->page_locks, m->page_unlocks, m->page_unmaps);
-#endif
-
#if HAVE_MMAP
if(!m->dumb) {
size_t len = m->pages * m->pgsz + m->hdrsz;
@@ -532,3 +498,160 @@ void *fmap_gets(fmap_t *m, char *dst, size_t *at, size_t max_len) {
}
return dst;
}
+
+/* ^^^^^ POSIX STUFF AVOVE ^^^^^ */
+
+#else /* __WIN32 */
+
+/* vvvvv WIN32 STUFF BELOW vvvvv */
+
+fmap_t *fmap(int fd, off_t offset, size_t len) { /* WIN32 */
+ unsigned int pages, mapsz, hdrsz, dumb = 1;
+ int pgsz = cli_getpagesize();
+ struct stat st;
+ fmap_t *m;
+
+ if(fstat(fd, &st)) {
+ cli_warnmsg("fmap: fstat failed\n");
+ return NULL;
+ }
+ if(offset < 0 || offset != fmap_align_to(offset, pgsz)) {
+ cli_warnmsg("fmap: attempted mapping with unaligned offset\n");
+ return NULL;
+ }
+ if(!len) len = st.st_size - offset; /* bound checked later */
+ if(!len) {
+ cli_warnmsg("fmap: attempted void mapping\n");
+ return NULL;
+ }
+ if(!CLI_ISCONTAINED(0, st.st_size, offset, len)) {
+ cli_warnmsg("fmap: attempted oof mapping\n");
+ return NULL;
+ }
+ if(!(m = (fmap_t *)cli_malloc(sizeof(fmap_t)))) {
+ cli_errmsg("fmap: canot allocate fmap_t\n", fd);
+ return NULL;
+ }
+ if((m->fh = _get_osfhandle(fd)) == INVALID_HANDLE_VALUE) {
+ cli_errmsg("fmap: cannot get a valid handle for descriptor %d\n", fd);
+ free(m);
+ return NULL;
+ }
+ if(!(m->mh = CreateFileMapping(m->fh, NULL, PAGE_READONLY, (DWORD)(len>>32), (DWORD)len, NULL))) {
+ cli_errmsg("fmap: cannot create a map of descriptor %d\n", fd);
+ free(m);
+ return NULL;
+ }
+ if(!(m->data = MapViewOfFile(m->mh, FILE_MAP_READ, (DWORD)(offset>>32), (DWORD)(offset), len))) {
+ cli_errmsg("fmap: cannot map file descriptor %d\n", fd);
+ CloseHandle(m->mh);
+ free(m);
+ return NULL;
+ }
+ m->fd = fd;
+ m->dumb = dumb;
+ m->mtime = st.st_mtime;
+ m->offset = offset;
+ m->len = len;
+ m->pages = pages;
+ m->hdrsz = hdrsz;
+ m->pgsz = pgsz;
+ m->paged = 0;
+ return m;
+}
+
+void funmap(fmap_t *m) { /* WIN32 */
+ UnmapViewOfFile(m->data);
+ CloseHandle(m->mh);
+ free((void *)m);
+}
+
+static void *fmap_need(fmap_t *m, size_t at, size_t len) { /* WIN32 */
+ if(!CLI_ISCONTAINED(0, m->len, at, len)) {
+ cli_warnmsg("fmap: attempted oof need\n");
+ return NULL;
+ }
+ if(!len)
+ return NULL;
+ return (void *)((char *)m->data + at);
+}
+
+void *fmap_need_off(fmap_t *m, size_t at, size_t len) { /* WIN32 */
+ return fmap_need(m, at, len);
+}
+void *fmap_need_off_once(fmap_t *m, size_t at, size_t len) { /* WIN32 */
+ return fmap_need(m, at, len);
+}
+void *fmap_need_ptr(fmap_t *m, void *ptr, size_t len) { /* WIN32 */
+ return fmap_need(m, (char *)ptr - (char *)m->data, len);
+}
+void *fmap_need_ptr_once(fmap_t *m, void *ptr, size_t len) { /* WIN32 */
+ return fmap_need(m, (char *)ptr - (char *)m->data, len);
+}
+void fmap_unneed_off(fmap_t *m, size_t at, size_t len) { /* WIN32 */
+}
+void fmap_unneed_ptr(fmap_t *m, void *ptr, size_t len) { /* WIN32 */
+}
+
+void *fmap_need_offstr(fmap_t *m, size_t at, size_t len_hint) { /* WIN32 */
+ char *ptr = (char *)m->data + at;
+
+ if(!len_hint || len_hint > m->len - at)
+ len_hint = m->len - at;
+
+ if(!CLI_ISCONTAINED(0, m->len, at, len_hint)) {
+ cli_warnmsg("fmap: attempted oof need_str\n");
+ return NULL;
+ }
+
+ if(memchr(ptr, 0, len_hint))
+ return (void *)ptr;
+ return NULL;
+}
+
+void *fmap_need_str(fmap_t *m, void *ptr, size_t len_hint) { /* WIN32 */
+ size_t at = (char *)ptr - (char *)m->data;
+ return fmap_need_offstr(m, at, len_hint);
+}
+
+void *fmap_gets(fmap_t *m, char *dst, size_t *at, size_t max_len) { /* WIN32 */
+ char *src = (char *)m->data + *at, *endptr = NULL;
+ size_t len = MIN(max_len-1, m->len - *at);
+
+ if(!len || !CLI_ISCONTAINED(0, m->len, *at, len)) {
+ cli_warnmsg("fmap: attempted oof need_str\n");
+ return NULL;
+ }
+
+ if((endptr = memchr(*src, '\n', len))) {
+ endptr++;
+ memcpy(dst, src, endptr - src);
+ dst[endptr - src] = '\0';
+ *at += endptr - src;
+ } else {
+ memcpy(dst, src, len);
+ dst[len] = '\0';
+ *at += len;
+ }
+ return dst;
+}
+
+#endif /* __WIN32 */
+
+
+/* vvvvv SHARED STUFF BELOW vvvvv */
+
+int fmap_readn(fmap_t *m, void *dst, size_t at, size_t len) {
+ char *src;
+
+ if(at > m->len)
+ return -1;
+ if(len > m->len - at)
+ len = m->len - at;
+ src = fmap_need_off_once(m, at, len);
+ if(!src)
+ return -1;
+ memcpy(dst, src, len);
+ return len;
+}
+
diff --git a/libclamav/fmap.h b/libclamav/fmap.h
index 52df35c..7ffa164 100644
--- a/libclamav/fmap.h
+++ b/libclamav/fmap.h
@@ -23,8 +23,6 @@
#include "cltypes.h"
-/* #define FMAPDEBUG */
-
typedef struct {
int fd;
unsigned int dumb;
@@ -35,12 +33,10 @@ typedef struct {
unsigned int hdrsz;
unsigned int pgsz;
unsigned int paged;
-#ifdef FMAPDEBUG
- unsigned int page_needs;
- unsigned int page_reads;
- unsigned int page_locks;
- unsigned int page_unlocks;
- unsigned int page_unmaps;
+#ifdef __WIN32
+ HANDLE fh;
+ HANDLE mh;
+ void *data;
#endif
uint32_t placeholder_for_bitmap;
} fmap_t;
diff --git a/libclamav/others.h b/libclamav/others.h
index fb0dfb2..2d179fb 100644
--- a/libclamav/others.h
+++ b/libclamav/others.h
@@ -362,6 +362,13 @@ void cli_dbgmsg_internal(const char *str, ...);
#undef HAVE_CLI_GETPAGESIZE
#endif
+#ifdef __WIN32
+int cli_getpagesize(void) {
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ return si.dwPageSize;
+}
+#else /* ! __WIN32 */
#if HAVE_SYSCONF_SC_PAGESIZE
static inline int cli_getpagesize(void) { return sysconf(_SC_PAGESIZE); }
#define HAVE_CLI_GETPAGESIZE 1
@@ -369,8 +376,9 @@ static inline int cli_getpagesize(void) { return sysconf(_SC_PAGESIZE); }
#if HAVE_GETPAGESIZE
static inline int cli_getpagesize(void) { return getpagesize(); }
#define HAVE_CLI_GETPAGESIZE 1
-#endif
-#endif
+#endif /* HAVE_GETPAGESIZE */
+#endif /* HAVE_SYSCONF_SC_PAGESIZE */
+#endif /* __WIN32 */
void *cli_malloc(size_t nmemb);
void *cli_calloc(size_t nmemb, size_t size);
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list