Theo de Raadt <dera...@cvs.openbsd.org> writes:

> The hiding of PAGE_SIZE is intentional.
>
> The code should be using getpagesize() or some API which asks the
> kernel.
>
> The reason is that PAGE_SIZE is not a standardized symbol, and on some
> of our architectures it changes between different processor models.

[...]

Here's a compile-tested diff.  Donovan, does this fix your problem?

$OpenBSD$
- take mkntfs_get_page_size() from mkntfs.c
  PAGE_SIZE is unusable on at least loongson
--- libntfs-3g/mft.c.orig       Wed Dec 25 02:12:11 2013
+++ libntfs-3g/mft.c    Wed Dec 25 02:16:16 2013
@@ -26,6 +26,9 @@
 #include "config.h"
 #endif
 
+#ifdef  HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
@@ -453,9 +456,28 @@ static int ntfs_is_mft(ntfs_inode *ni)
        return 0;
 }
 
-#ifndef PAGE_SIZE
-#define PAGE_SIZE 4096
+/**
+ * mkntfs_get_page_size - detect the system's memory page size.
+ */
+static long mkntfs_get_page_size(void)
+{
+       long page_size;
+#ifdef _SC_PAGESIZE
+       page_size = sysconf(_SC_PAGESIZE);
+       if (page_size < 0)
 #endif
+#ifdef _SC_PAGE_SIZE
+               page_size = sysconf(_SC_PAGE_SIZE);
+       if (page_size < 0)
+#endif
+       {
+               ntfs_log_warning("Failed to determine system page size.  "
+                               "Assuming safe default of 4096 bytes.\n");
+               return 4096;
+       }
+       ntfs_log_debug("System page size is %li bytes.\n", page_size);
+       return page_size;
+}
 
 #define RESERVED_MFT_RECORDS   64
 
@@ -481,6 +503,7 @@ static int ntfs_mft_bitmap_find_free_rec(ntfs_volume *
        s64 pass_end, ll, data_pos, pass_start, ofs, bit;
        ntfs_attr *mftbmp_na;
        u8 *buf, *byte;
+       long page_size;
        unsigned int size;
        u8 pass, b;
        int ret = -1;
@@ -492,7 +515,8 @@ static int ntfs_mft_bitmap_find_free_rec(ntfs_volume *
         * Set the end of the pass making sure we do not overflow the mft
         * bitmap.
         */
-       size = PAGE_SIZE;
+       page_size = mkntfs_get_page_size();
+       size = page_size;
        pass_end = vol->mft_na->allocated_size >> vol->mft_record_size_bits;
        ll = mftbmp_na->initialized_size << 3;
        if (pass_end > ll)
@@ -518,7 +542,7 @@ static int ntfs_mft_bitmap_find_free_rec(ntfs_volume *
                pass = 2;
        }
        pass_start = data_pos;
-       buf = ntfs_malloc(PAGE_SIZE);
+       buf = ntfs_malloc(page_size);
        if (!buf)
                goto leave;
        
@@ -531,7 +555,7 @@ static int ntfs_mft_bitmap_find_free_rec(ntfs_volume *
        b = 0;
 #endif
        /* Loop until a free mft record is found. */
-       for (; pass <= 2; size = PAGE_SIZE) {
+       for (; pass <= 2; size = page_size) {
                /* Cap size to pass_end. */
                ofs = data_pos >> 3;
                ll = ((pass_end + 7) >> 3) - ofs;


-- 
jca | PGP: 0x06A11494 / 61DB D9A0 00A4 67CF 2A90  8961 6191 8FBF 06A1 1494

Reply via email to