X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fclient%2Ffile-slave.c;h=8193e384f0ce7e932b754c2c63261cbcd978e7ec;hb=0629f8bd3224b53621f1f19157b715c444c0d256;hp=df3aaef6ce5a80037d76115e36bb9a5dfa65e9eb;hpb=3130c0f5769f92229e4345027052597e2244f439;p=captive.git diff --git a/src/libcaptive/client/file-slave.c b/src/libcaptive/client/file-slave.c index df3aaef..8193e38 100644 --- a/src/libcaptive/client/file-slave.c +++ b/src/libcaptive/client/file-slave.c @@ -37,9 +37,11 @@ #include "captive/usecount.h" #include "vfs.h" #include "vfs-slave.h" +#include "../cc/sharedcachemap.h" /* Config: */ +#define MAX_FILE_READ 0x8000000 /* FIXME: Workaround memory consumption for non-journalled fastfat.sys */ #define MAX_FILE_WRITTEN 0x100000 /* FIXME: Workaround memory consumption for non-journalled fastfat.sys */ @@ -149,6 +151,9 @@ NTSTATUS err; g_return_val_if_fail(captive_file_slave_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + if (captive_shared_cache_map_restart_needed()) + return GNOME_VFS_ERROR_SERVICE_OBSOLETE; + errvfsresult=captive_ObjectAttributes_init(pathname,&file_ObjectAttributes); g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); @@ -156,6 +161,7 @@ NTSTATUS err; err=IoCreateFile( &file_Handle, /* FileHandle */ 0 + /* sniffed: | SYNCHRONIZE */ |(!(mode&GNOME_VFS_OPEN_READ ) ? 0 : FILE_READ_DATA) |(!(mode&GNOME_VFS_OPEN_WRITE) ? 0 : FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES) |( mode!=0 ? 0 : FILE_READ_ATTRIBUTES) @@ -297,6 +303,7 @@ NTSTATUS err; IO_STATUS_BLOCK file_IoStatusBlock; LARGE_INTEGER file_offset; GnomeVFSResult errvfsresult; +static GnomeVFSFileSize total_read=0; g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -307,6 +314,11 @@ GnomeVFSResult errvfsresult; g_return_val_if_fail(captive_file_slave_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + /* FIXME: Workaround memory consumption for non-journalled fastfat.sys */ + if (total_read>=MAX_FILE_READ && captive_options->sandbox) + return GNOME_VFS_ERROR_SERVICE_OBSOLETE; + total_read+=num_bytes; + file_offset.QuadPart=captive_file_slave_object->offset; err=NtReadFile( captive_file_slave_object->file_Handle, /* FileHandle */ @@ -774,8 +786,8 @@ NTSTATUS err; if (mask & GNOME_VFS_SET_FILE_INFO_TIME) { g_assert(info->valid_fields & (0 | GNOME_VFS_FILE_INFO_FIELDS_ATIME - | GNOME_VFS_FILE_INFO_FIELDS_MTIME - | GNOME_VFS_FILE_INFO_FIELDS_CTIME)); + | GNOME_VFS_FILE_INFO_FIELDS_MTIME)); + /* !GNOME_VFS_FILE_INFO_FIELDS_CTIME is used by FUSE op_utime(). */ if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) { RtlSecondsSince1970ToTime( info->atime, /* SecondsSince1970 */