* PERFORMANCE OF THIS SOFTWARE.
*/
+#include "fcint.h"
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
-#include <unistd.h>
-#include "fcint.h"
-#include <unistd.h>
#if defined(HAVE_MMAP) || defined(__CYGWIN__)
+# include <unistd.h>
# include <sys/mman.h>
-# include <sys/utsname.h>
+#elif defined(_WIN32)
+# include <windows.h>
#endif
#define ENDIAN_TEST 0x12345678
if (cache->fd == -1)
return FcFalse;
- if (!(dir = (char *)FcConfigNormalizeFontDir (config, (FcChar8 *)dir)))
- return FcFalse; /* non-existing directory */
+ if (config)
+ if (!(dir = (char *)FcConfigNormalizeFontDir (config, (FcChar8 *)dir)))
+ return FcFalse; /* non-existing directory */
for (d = cache->dirs; d; d = d->next)
{
if (!FcCacheWriteString (fd, header))
goto bail4;
+ free (header);
+
for (dir = cache->dirs; dir; dir = dir->next)
{
int i;
FcCacheNextOffset(off_t w)
{
static long pagesize = -1;
+
+ if (w == -1)
+ return w;
+
if (pagesize == -1)
#if defined (HAVE_SYSCONF)
pagesize = sysconf(_SC_PAGESIZE);
fd = open(cache_hashed, O_RDONLY | O_BINARY);
if (fd == -1)
{
+ FcStrFree ((FcChar8 *)cache_hashed);
FcStrFree ((FcChar8 *)cache_file);
return FcTrue;
}
{
FcCache metadata;
void * current_dir_block;
- off_t pos;
+ off_t pos, endpos;
if (read(fd, &metadata, sizeof(FcCache)) != sizeof(FcCache))
return FcFalse;
}
pos = FcCacheNextOffset (lseek(fd, 0, SEEK_CUR));
+
+ /* This is not failsafe (multi-arches can break it),
+ * but fd has got to have at least as many bytes as
+ * metadata.count, or something's going to go horribly wrong. */
+ if (pos == (off_t)-1)
+ return FcFalse;
+
+ endpos = lseek (fd, 0, SEEK_END);
+ if (endpos == (off_t)-1 || endpos - pos < metadata.count)
+ return FcFalse;
+ if (lseek (fd, pos, SEEK_SET) == -1)
+ return FcFalse;
+
#if defined(HAVE_MMAP) || defined(__CYGWIN__)
current_dir_block = mmap (0, metadata.count,
PROT_READ, MAP_SHARED, fd, pos);
if (current_dir_block == MAP_FAILED)
return FcFalse;
+#elif defined(_WIN32)
+ {
+ HANDLE hFileMap;
+
+ hFileMap = CreateFileMapping((HANDLE) _get_osfhandle(fd), NULL, PAGE_READONLY, 0, 0, NULL);
+ if (hFileMap == NULL)
+ return FcFalse;
+
+ current_dir_block = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, metadata.count + pos);
+ if (current_dir_block == NULL)
+ {
+ CloseHandle (hFileMap);
+ return FcFalse;
+ }
+
+ current_dir_block = (void *)((char *)current_dir_block + pos);
+ }
#else
current_dir_block = malloc (metadata.count);
if (!current_dir_block)