CcMapData(): Allow unaligned tail mapping of MAP_NO_READ.
authorshort <>
Sun, 13 Jul 2003 19:27:04 +0000 (19:27 +0000)
committershort <>
Sun, 13 Jul 2003 19:27:04 +0000 (19:27 +0000)
CcCopyWrite(): Prevent pre-reading of data by PIN_NO_READ.
+some sanity checks

src/libcaptive/cc/map.c

index 1fb2db2..057b065 100644 (file)
@@ -850,7 +850,12 @@ GPtrArray *read_array;
 
        if (Flags&MAP_NO_READ) {
                g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(FileOffset->QuadPart,PAGE_SIZE));    /* NOT IMPLEMENTED YET */
-               g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING(Length,PAGE_SIZE));    /* NOT IMPLEMENTED YET */
+               /* It may not be aligned as this function is prepared by 'after_eof' for incomplete tails.
+                * It is being used at least by ntfs.sys of NT-5.1sp1 CcCopyWrite().
+                */
+#if 0
+               g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(FileOffset->QuadPart+Length,PAGE_SIZE));     /* NOT IMPLEMENTED YET */
+#endif
                }
 
        g_return_val_if_fail(FileObject->SectionObjectPointers!=NULL,FALSE);
@@ -1769,6 +1774,7 @@ gboolean errbool;
 
        g_return_val_if_fail(FileObject!=NULL,FALSE);
        g_return_val_if_fail(FileOffset!=NULL,FALSE);
+       g_return_val_if_fail(Wait==TRUE || Wait==FALSE,FALSE);  /* Prevent 'Wait' upgrade to 'Flags'. */
        g_return_val_if_fail(Buffer!=NULL,FALSE);
        g_return_val_if_fail(IoStatus!=NULL,FALSE);
 
@@ -1783,7 +1789,8 @@ gboolean errbool;
                                FileObject,     /* FileObject */
                                FileOffset,     /* FileOffset */
                                Length, /* Length */
-                               Wait,   /* Wait */
+                               0               /* Flags; !PIN_NO_READ */
+                                               | (Wait ? PIN_WAIT : 0),
                                &MappedBcb,     /* Bcb */
                                &MappedBuffer); /* Buffer */
                g_return_val_if_fail(errbool==TRUE,FALSE);
@@ -1827,6 +1834,7 @@ gboolean errbool;
 
        g_return_val_if_fail(FileObject!=NULL,FALSE);
        g_return_val_if_fail(FileOffset!=NULL,FALSE);
+       g_return_val_if_fail(Wait==TRUE || Wait==FALSE,FALSE);  /* Prevent 'Wait' upgrade to 'Flags'. */
        g_return_val_if_fail(Buffer!=NULL,FALSE);
 
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,FileOffset=0x%llX,Length=0x%lX,Wait=%d",G_STRLOC,
@@ -1837,7 +1845,8 @@ gboolean errbool;
                                FileObject,     /* FileObject */
                                FileOffset,     /* FileOffset */
                                Length, /* Length */
-                               Wait,   /* Wait */
+                               PIN_NO_READ             /* Flags */
+                                               | (Wait ? PIN_WAIT : 0),
                                &MappedBcb,     /* Bcb */
                                &MappedBuffer); /* Buffer */
                g_return_val_if_fail(errbool==TRUE,FALSE);
@@ -1872,6 +1881,8 @@ gboolean errbool;
 BOOLEAN CcCanIWrite(IN PFILE_OBJECT FileObject,IN ULONG BytesToWrite,IN BOOLEAN Wait,IN BOOLEAN Retrying)
 {
        g_return_val_if_fail(FileObject!=NULL,FALSE);
+       g_return_val_if_fail(Wait==TRUE || Wait==FALSE,FALSE);  /* Prevent 'Wait' upgrade to 'Flags'. */
+       g_return_val_if_fail(Retrying==TRUE || Retrying==FALSE,FALSE);
 
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,BytesToWrite=0x%lX,Wait=%d,Retrying=%d",G_STRLOC,
                        FileObject,(gulong)BytesToWrite,(gint)Wait,(gint)Retrying);
@@ -1990,6 +2001,7 @@ BOOLEAN errboolean;
        g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
        g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
                    ==(ULONG)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
+       g_return_val_if_fail(Wait==TRUE || Wait==FALSE,FALSE);  /* Prevent 'Wait' upgrade to 'Flags'. */
 
        SectionObjectPointers_orig=FileObject->SectionObjectPointers;