MMAP_FILE_ACCESS_READ_WRITE_EXECUTE = 5,
};
-#ifndef DEFFILEMODE
-#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
+#ifdef DEFFILEMODE
+#define DEFAULT_FILEMODE DEFFILEMODE
+#else
+#define DEFAULT_FILEMODE 0666
#endif
static int mmap_init_state;
}
if (path) //FIXME use io portability?
- fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFFILEMODE);
+ fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFAULT_FILEMODE);
else
fd = dup (input_fd);
return (void*)handle;
}
-#define MONO_ANON_FILE_TEMPLATE "/tmp/mono.anonmap.XXXXXXXXX"
+#define MONO_ANON_FILE_TEMPLATE "/mono.anonmap.XXXXXXXXX"
static void*
open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, int options, int *error)
{
//XXX should we ftruncate if the file is smaller than capacity?
} else {
int fd;
- char file_name [sizeof (MONO_ANON_FILE_TEMPLATE) + 1];
+ char *file_name;
+ const char *tmp_dir;
+ int unused G_GNUC_UNUSED, alloc_size;
if (mode == FILE_MODE_OPEN) {
*error = FILE_NOT_FOUND;
}
*capacity = align_up_to_page_size (*capacity);
- strcpy (file_name, MONO_ANON_FILE_TEMPLATE);
+ tmp_dir = g_get_tmp_dir ();
+ alloc_size = strlen (tmp_dir) + strlen (MONO_ANON_FILE_TEMPLATE) + 1;
+ if (alloc_size > 1024) {//rather fail that stack overflow
+ *error = COULD_NOT_MAP_MEMORY;
+ goto done;
+ }
+ file_name = alloca (alloc_size);
+ strcpy (file_name, tmp_dir);
+ strcat (file_name, MONO_ANON_FILE_TEMPLATE);
+
fd = mkstemp (file_name);
if (fd == -1) {
*error = COULD_NOT_MAP_MEMORY;
}
unlink (file_name);
- ftruncate (fd, (off_t)*capacity);
+ unused = ftruncate (fd, (off_t)*capacity);
handle = g_new0 (MmapHandle, 1);
handle->ref_count = 1;