ntfs-3g: adopted, updated README, fuse now an optional dependency

This commit is contained in:
John McQuah 2023-03-03 11:22:38 -05:00
parent e0592aa78c
commit 901d41826a
10 changed files with 50 additions and 649 deletions

View File

@ -1,12 +1,11 @@
drwxr-xr-x root/root lib/
drwxr-xr-x root/root sbin/
lrwxrwxrwx root/root sbin/fsck.ntfs -> ../usr/bin/ntfsfix
lrwxrwxrwx root/root sbin/mount.ntfs -> ../usr/bin/ntfs-3g
lrwxrwxrwx root/root sbin/fsck.ntfs -> /usr/bin/ntfsfix
lrwxrwxrwx root/root sbin/mount.lowntfs-3g -> /usr/bin/lowntfs-3g
lrwxrwxrwx root/root sbin/mount.ntfs -> /usr/bin/ntfs-3g
lrwxrwxrwx root/root sbin/mount.ntfs-3g -> /usr/bin/ntfs-3g
drwxr-xr-x root/root usr/
drwxr-xr-x root/root usr/bin/
-rwxr-xr-x root/root usr/bin/lowntfs-3g
lrwxrwxrwx root/root usr/bin/mount.lowntfs-3g -> /usr/bin/lowntfs-3g
lrwxrwxrwx root/root usr/bin/mount.ntfs-3g -> /usr/bin/ntfs-3g
-rwxr-xr-x root/root usr/bin/ntfs-3g
-rwxr-xr-x root/root usr/bin/ntfs-3g.probe
-rwxr-xr-x root/root usr/bin/ntfscat
@ -63,11 +62,9 @@ drwxr-xr-x root/root usr/include/ntfs-3g/
-rw-r--r-- root/root usr/include/ntfs-3g/volume.h
-rw-r--r-- root/root usr/include/ntfs-3g/xattrs.h
drwxr-xr-x root/root usr/lib/
-rwxr-xr-x root/root usr/lib/libntfs-3g.la
lrwxrwxrwx root/root usr/lib/libntfs-3g.so -> libntfs-3g.so.89.0.0
lrwxrwxrwx root/root usr/lib/libntfs-3g.so.89 -> libntfs-3g.so.89.0.0
-rwxr-xr-x root/root usr/lib/libntfs-3g.so.89.0.0
drwxr-xr-x root/root usr/lib/ntfs-3g/
drwxr-xr-x root/root usr/lib/pkgconfig/
-rw-r--r-- root/root usr/lib/pkgconfig/libntfs-3g.pc
drwxr-xr-x root/root usr/sbin/

View File

@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
RWSagIOpLGJF3zeXM4Ehi56y5ovXcmTBWVpL0rekHf6ewu+MXm40HkkCoqvN2D/40M2ILp2TJWhqSr+9k9bbJL4Tz+CJpe17mQc=
SHA256 (Pkgfile) = a508d0fb8db3f6c4b81ed0337aa972566badf6ad700b071944a099388018af1b
SHA256 (.footprint) = 92867ed56e7f25d0ea6b69ad87e7c1a28f9152a40c1079918680819641c04bf1
RWSagIOpLGJF38EBGf3RrUoob1qAwTDh9VQX8Ra16S3JgWZhzwTG0Icu0nF+IIDufg0zJRTxOMdLvlXwV/3FwDBw0wBlqgAR+gs=
SHA256 (Pkgfile) = e23aad5d39daa07dc4ae1d0df22342e799c962ccb4a95d12e3fe75ac8dd8f282
SHA256 (.footprint) = 90c3bfc133598eefdf4e35194ef566b5567104aef099a8650c58dad6304ab29c
SHA256 (ntfs-3g_ntfsprogs-2022.10.3.tgz) = f20e36ee68074b845e3629e6bced4706ad053804cbaf062fbae60738f854170c

View File

@ -1,63 +0,0 @@
From 85c1634a26faa572d3c558d4cf8aaaca5202d4e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-Pierre=20Andr=C3=A9?= <jean-pierre.andre@wanadoo.fr>
Date: Wed, 19 Dec 2018 15:57:50 +0100
Subject: [PATCH] Fixed reporting an error when failed to build the mountpoint
The size check was inefficient because getcwd() uses an unsigned int
argument.
---
src/lowntfs-3g.c | 6 +++++-
src/ntfs-3g.c | 6 +++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/lowntfs-3g.c b/src/lowntfs-3g.c
index 993867fa..0660439b 100644
--- a/src/lowntfs-3g.c
+++ b/src/lowntfs-3g.c
@@ -4411,7 +4411,8 @@ int main(int argc, char *argv[])
else {
ctx->abs_mnt_point = (char*)ntfs_malloc(PATH_MAX);
if (ctx->abs_mnt_point) {
- if (getcwd(ctx->abs_mnt_point,
+ if ((strlen(opts.mnt_point) < PATH_MAX)
+ && getcwd(ctx->abs_mnt_point,
PATH_MAX - strlen(opts.mnt_point) - 1)) {
strcat(ctx->abs_mnt_point, "/");
strcat(ctx->abs_mnt_point, opts.mnt_point);
@@ -4419,6 +4420,9 @@ int main(int argc, char *argv[])
/* Solaris also wants the absolute mount point */
opts.mnt_point = ctx->abs_mnt_point;
#endif /* defined(__sun) && defined (__SVR4) */
+ } else {
+ free(ctx->abs_mnt_point);
+ ctx->abs_mnt_point = (char*)NULL;
}
}
}
diff --git a/src/ntfs-3g.c b/src/ntfs-3g.c
index 6ce89fef..4e0912ae 100644
--- a/src/ntfs-3g.c
+++ b/src/ntfs-3g.c
@@ -4148,7 +4148,8 @@ int main(int argc, char *argv[])
else {
ctx->abs_mnt_point = (char*)ntfs_malloc(PATH_MAX);
if (ctx->abs_mnt_point) {
- if (getcwd(ctx->abs_mnt_point,
+ if ((strlen(opts.mnt_point) < PATH_MAX)
+ && getcwd(ctx->abs_mnt_point,
PATH_MAX - strlen(opts.mnt_point) - 1)) {
strcat(ctx->abs_mnt_point, "/");
strcat(ctx->abs_mnt_point, opts.mnt_point);
@@ -4156,6 +4157,9 @@ int main(int argc, char *argv[])
/* Solaris also wants the absolute mount point */
opts.mnt_point = ctx->abs_mnt_point;
#endif /* defined(__sun) && defined (__SVR4) */
+ } else {
+ free(ctx->abs_mnt_point);
+ ctx->abs_mnt_point = (char*)NULL;
}
}
}
--
2.26.1

View File

@ -1,42 +1,48 @@
# Description: Freely available NTFS driver with read and write support.
# URL: https://www.tuxera.com/company/open-source/
# Maintainer: Danny Rawlins, crux at romster dot me
# Depends on: fuse gnutls libgcrypt
# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: gnutls libgcrypt
# Optional: fuse
name=ntfs-3g
version=2022.10.3
release=1
source=(https://tuxera.com/opensource/ntfs-3g_ntfsprogs-$version.tgz)
release=2
source=(https://tuxera.com/opensource/${name}_ntfsprogs-$version.tgz)
build() {
cd ntfs-3g_ntfsprogs-$version
cd ${name}_ntfsprogs-$version
sed 's|$(DESTDIR)/sbin|$(DESTDIR)/usr/bin|' -i {ntfsprogs,src}/Makefile.in
install -d $PKG/lib
# $DESTDIR/lib must exist during install; the Makefile honors
# EPREFIX by moving to the desired location afterward
mkdir $PKG/lib
./configure \
--prefix=/usr \
--exec-prefix=/usr \
--enable-crypto \
--enable-extras \
--enable-ldscript \
--enable-posix-acls \
--enable-xattr-mappings \
--with-fuse=external \
--disable-ldconfig \
--disable-static \
--without-uuid \
--without-hd
PKGMK_NTFS3="--prefix=/usr
--exec-prefix=/usr
--bindir=/usr/bin
--sbindir=/usr/sbin
--libexecdir=/usr/lib
--enable-crypto
--enable-extras
--enable-ldscript
--enable-posix-acls
--enable-xattr-mappings
--disable-ldconfig
--disable-static
--without-uuid
--without-hd"
prt-get isinst fuse && PKGMK_NTFS3+=" --with-fuse=external" \
|| PKGMK_NTFS3+=" --with-fuse=internal"
./configure $PKGMK_NTFS3
make
make DESTDIR=$PKG install
mkdir $PKG/sbin
ln -s ../usr/bin/ntfs-3g $PKG/sbin/mount.ntfs
ln -s ../usr/bin/ntfsfix $PKG/sbin/fsck.ntfs
ln -s /usr/bin/ntfs-3g $PKG/sbin/mount.ntfs
ln -s /usr/bin/ntfsfix $PKG/sbin/fsck.ntfs
ln -s ntfs-3g.8 $PKG/usr/share/man/man8/mount.ntfs.8
ln -s ntfsfix.8 $PKG/usr/share/man/man8/fsck.ntfs.8
rm -r $PKG/usr/share/doc
rm -r $PKG/usr/share/doc $PKG/usr/lib/$name $PKG/lib $PKG/usr/lib/*.la
}

View File

@ -1,15 +1,16 @@
Kernel Configuration
Linux 5.15.55 and later come with robust read/write support for NTFS
partitions. If the ntfs3 driver has been built as a module, then it should
appear under /lib/modules/$(uname -r)/kernel/fs; if built into a monolithic
kernel, it should be listed under /proc/filesystems. Mounting and copying
to/from an NTFS partition can be accomplished with the kernel driver alone,
but by installing this port you get additional userspace tools for fsck,
mkfs, wiping, and resizing NTFS partitions.
Enable the following options in the kernel configuration and recompile the
kernel if necessary:
File systems --->
<*/M> FUSE (Filesystem in Userspace) support [CONFIG_FUSE_FS]
Installation of Ntfs-3g
If you want ordinary users to be able to mount NTFS partitions you'll need to
set mount.ntfs with the root user ID. Note: it is probably unsafe to do this
on a computer that needs to be secure (like a server). As the root user:
chmod -v 4755 /sbin/mount.ntfs
Alternative to the (probably unsafe) `chmod 4755 /usr/bin/ntfs-3g`
To allow ordinary users to mount NTFS partitions, you can either set ntfs-3g
with the root user ID, or list the filesystem in /etc/fstab with the
rw,noauto,uid,gid options (assuming you compiled the ntfs3 driver with
your kernel). Example /etc/fstab line:
/dev/sdb1 /media/ntfs ntfs3 rw,uid=1000,gid=1000,noauto

View File

@ -1,25 +0,0 @@
we handle split /usr logic ourselves. this ends up breaking when building
for an abi that doesn't exist in / (like cross-compiling) as the tests fail.
--- a/libntfs-3g/Makefile.in
+++ b/libntfs-3g/Makefile.in
@@ -912,19 +912,6 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local \
uninstall-rootlibLTLIBRARIES
-# We may need to move .so files to root
-# And create ldscript or symbolic link from /usr
-install-exec-hook: install-rootlibLTLIBRARIES
-@INSTALL_LIBRARY_TRUE@ if [ ! "$(rootlibdir)" -ef "$(libdir)" ]; then \
-@INSTALL_LIBRARY_TRUE@ $(MV) -f "$(DESTDIR)/$(libdir)"/libntfs-3g.so* "$(DESTDIR)/$(rootlibdir)"; \
-@INSTALL_LIBRARY_TRUE@ fi
-@GENERATE_LDSCRIPT_TRUE@@INSTALL_LIBRARY_TRUE@ if [ ! "$(rootlibdir)" -ef "$(libdir)" ]; then \
-@GENERATE_LDSCRIPT_TRUE@@INSTALL_LIBRARY_TRUE@ $(install_sh_PROGRAM) "libntfs-3g.script.so" "$(DESTDIR)/$(libdir)/libntfs-3g.so"; \
-@GENERATE_LDSCRIPT_TRUE@@INSTALL_LIBRARY_TRUE@ fi
-@GENERATE_LDSCRIPT_FALSE@@INSTALL_LIBRARY_TRUE@ if [ ! "$(rootlibdir)" -ef "$(libdir)" ]; then \
-@GENERATE_LDSCRIPT_FALSE@@INSTALL_LIBRARY_TRUE@ $(LN_S) "$(rootlibdir)/libntfs-3g.so" "$(DESTDIR)/$(libdir)/libntfs-3g.so"; \
-@GENERATE_LDSCRIPT_FALSE@@INSTALL_LIBRARY_TRUE@ fi
-
uninstall-local:
@INSTALL_LIBRARY_TRUE@ $(RM) -f "$(DESTDIR)/$(rootlibdir)"/libntfs-3g.so*

View File

@ -1,43 +0,0 @@
include the headers that define major/minor/makedev in more places
https://bugs.gentoo.org/580136
--- a/libntfs-3g/ioctl.c
+++ b/libntfs-3g/ioctl.c
@@ -57,6 +57,12 @@
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_MKDEV_H
+#include <sys/mkdev.h>
+#endif
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
--- a/src/lowntfs-3g.c
+++ b/src/lowntfs-3g.c
@@ -76,6 +76,9 @@
#ifdef HAVE_SYS_MKDEV_H
#include <sys/mkdev.h>
#endif
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#endif
#if defined(__APPLE__) || defined(__DARWIN__)
#include <sys/dirent.h>
--- a/src/ntfs-3g.c
+++ b/src/ntfs-3g.c
@@ -75,6 +75,9 @@
#ifdef HAVE_SYS_MKDEV_H
#include <sys/mkdev.h>
#endif
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#endif
#if defined(__APPLE__) || defined(__DARWIN__)
#include <sys/dirent.h>

View File

@ -1,379 +0,0 @@
--- a/libntfs-3g/bootsect.c.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/libntfs-3g/bootsect.c 2018-05-07 09:11:13.004710800 +0200
@@ -38,6 +38,7 @@
#include <errno.h>
#endif
+#include "param.h"
#include "compat.h"
#include "bootsect.h"
#include "debug.h"
@@ -61,6 +62,7 @@
{
u32 i;
BOOL ret = FALSE;
+ u16 sectors_per_cluster;
ntfs_log_debug("Beginning bootsector check.\n");
@@ -83,15 +85,27 @@
case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128:
break;
default:
- ntfs_log_error("Unexpected sectors per cluster value (%d).\n",
- b->bpb.sectors_per_cluster);
- goto not_ntfs;
+ if ((b->bpb.sectors_per_cluster < 240)
+ || (b->bpb.sectors_per_cluster > 249)) {
+ if (b->bpb.sectors_per_cluster > 128)
+ ntfs_log_error("Unexpected sectors"
+ " per cluster value (code 0x%x)\n",
+ b->bpb.sectors_per_cluster);
+ else
+ ntfs_log_error("Unexpected sectors"
+ " per cluster value (%d).\n",
+ b->bpb.sectors_per_cluster);
+ goto not_ntfs;
+ }
}
ntfs_log_debug("Checking cluster size.\n");
- i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) *
- b->bpb.sectors_per_cluster;
- if (i > 65536) {
+ if (b->bpb.sectors_per_cluster > 128)
+ sectors_per_cluster = 1 << (256 - b->bpb.sectors_per_cluster);
+ else
+ sectors_per_cluster = b->bpb.sectors_per_cluster;
+ i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) * sectors_per_cluster;
+ if (i > NTFS_MAX_CLUSTER_SIZE) {
ntfs_log_error("Unexpected cluster size (%d).\n", i);
goto not_ntfs;
}
@@ -171,7 +185,7 @@
int ntfs_boot_sector_parse(ntfs_volume *vol, const NTFS_BOOT_SECTOR *bs)
{
s64 sectors;
- u8 sectors_per_cluster;
+ u16 sectors_per_cluster;
s8 c;
/* We return -1 with errno = EINVAL on error. */
@@ -186,7 +200,10 @@
* below or equal the number_of_clusters) really belong in the
* ntfs_boot_sector_is_ntfs but in this way we can just do this once.
*/
- sectors_per_cluster = bs->bpb.sectors_per_cluster;
+ if (bs->bpb.sectors_per_cluster > 128)
+ sectors_per_cluster = 1 << (256 - bs->bpb.sectors_per_cluster);
+ else
+ sectors_per_cluster = bs->bpb.sectors_per_cluster;
ntfs_log_debug("SectorsPerCluster = 0x%x\n", sectors_per_cluster);
if (sectors_per_cluster & (sectors_per_cluster - 1)) {
ntfs_log_error("sectors_per_cluster (%d) is not a power of 2."
--- a/ntfsprogs/mkntfs.8.in.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/ntfsprogs/mkntfs.8.in 2018-05-07 09:11:13.014132400 +0200
@@ -132,7 +132,7 @@
.TP
\fB\-c\fR, \fB\-\-cluster\-size\fR BYTES
Specify the size of clusters in bytes. Valid cluster size values are powers of
-two, with at least 256, and at most 65536 bytes per cluster. If omitted,
+two, with at least 256, and at most 2097152 bytes (2MB) per cluster. If omitted,
.B mkntfs
uses 4096 bytes as the default cluster size.
.sp
--- a/ntfsprogs/mkntfs.c.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/ntfsprogs/mkntfs.c 2018-05-07 09:11:13.035522300 +0200
@@ -6,7 +6,7 @@
* Copyright (c) 2002-2006 Szabolcs Szakacsits
* Copyright (c) 2005 Erik Sornes
* Copyright (c) 2007 Yura Pakhuchiy
- * Copyright (c) 2010-2014 Jean-Pierre Andre
+ * Copyright (c) 2010-2018 Jean-Pierre Andre
*
* This utility will create an NTFS 1.2 or 3.1 volume on a user
* specified (block) device.
@@ -119,6 +119,7 @@
# endif
#endif
+#include "param.h"
#include "security.h"
#include "types.h"
#include "attrib.h"
@@ -287,7 +288,7 @@
ntfs_log_info("Copyright (c) 2002-2006 Szabolcs Szakacsits\n");
ntfs_log_info("Copyright (c) 2005 Erik Sornes\n");
ntfs_log_info("Copyright (c) 2007 Yura Pakhuchiy\n");
- ntfs_log_info("Copyright (c) 2010-2014 Jean-Pierre Andre\n");
+ ntfs_log_info("Copyright (c) 2010-2018 Jean-Pierre Andre\n");
ntfs_log_info("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
@@ -3719,11 +3720,11 @@
/*
* For huge volumes, grow the cluster size until the number of
* clusters fits into 32 bits or the cluster size exceeds the
- * maximum limit of 64kiB.
+ * maximum limit of NTFS_MAX_CLUSTER_SIZE.
*/
while (volume_size >> (ffs(vol->cluster_size) - 1 + 32)) {
vol->cluster_size <<= 1;
- if (vol->cluster_size > 65535) {
+ if (vol->cluster_size >= NTFS_MAX_CLUSTER_SIZE) {
ntfs_log_error("Device is too large to hold an "
"NTFS volume (maximum size is "
"256TiB).\n");
@@ -3744,15 +3745,18 @@
"to, or larger than, the sector size.\n");
return FALSE;
}
- if (vol->cluster_size > 128 * (u32)opts.sector_size) {
+ /* Before Windows 10 Creators, the limit was 128 */
+ if (vol->cluster_size > 4096 * (u32)opts.sector_size) {
ntfs_log_error("The cluster size is invalid. It cannot be "
- "more that 128 times the size of the sector "
+ "more that 4096 times the size of the sector "
"size.\n");
return FALSE;
}
- if (vol->cluster_size > 65536) {
+ if (vol->cluster_size > NTFS_MAX_CLUSTER_SIZE) {
ntfs_log_error("The cluster size is invalid. The maximum "
- "cluster size is 65536 bytes (64kiB).\n");
+ "cluster size is %lu bytes (%lukiB).\n",
+ (unsigned long)NTFS_MAX_CLUSTER_SIZE,
+ (unsigned long)(NTFS_MAX_CLUSTER_SIZE >> 10));
return FALSE;
}
vol->cluster_size_bits = ffs(vol->cluster_size) - 1;
@@ -4387,6 +4391,7 @@
u8 *sd;
FILE_ATTR_FLAGS extend_flags;
VOLUME_FLAGS volume_flags = const_cpu_to_le16(0);
+ int sectors_per_cluster;
int nr_sysfiles;
int buf_sds_first_size;
char *buf_sds;
@@ -4639,8 +4644,11 @@
* already inserted, so no need to worry about these things.
*/
bs->bpb.bytes_per_sector = cpu_to_le16(opts.sector_size);
- bs->bpb.sectors_per_cluster = (u8)(g_vol->cluster_size /
- opts.sector_size);
+ sectors_per_cluster = g_vol->cluster_size / opts.sector_size;
+ if (sectors_per_cluster > 128)
+ bs->bpb.sectors_per_cluster = 257 - ffs(sectors_per_cluster);
+ else
+ bs->bpb.sectors_per_cluster = sectors_per_cluster;
bs->bpb.media_type = 0xf8; /* hard disk */
bs->bpb.sectors_per_track = cpu_to_le16(opts.sectors_per_track);
ntfs_log_debug("sectors per track = %ld (0x%lx)\n",
--- a/ntfsprogs/ntfsclone.c.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/ntfsprogs/ntfsclone.c 2018-05-07 09:11:38.245007100 +0200
@@ -3,7 +3,7 @@
*
* Copyright (c) 2003-2006 Szabolcs Szakacsits
* Copyright (c) 2004-2006 Anton Altaparmakov
- * Copyright (c) 2010-2016 Jean-Pierre Andre
+ * Copyright (c) 2010-2018 Jean-Pierre Andre
* Special image format support copyright (c) 2004 Per Olofsson
*
* Clone NTFS data and/or metadata to a sparse file, image, device or stdout.
@@ -71,6 +71,7 @@
*/
#define NTFS_DO_NOT_CHECK_ENDIANS
+#include "param.h"
#include "debug.h"
#include "types.h"
#include "support.h"
@@ -270,7 +271,6 @@
#define LAST_METADATA_INODE 11
-#define NTFS_MAX_CLUSTER_SIZE 65536
#define NTFS_SECTOR_SIZE 512
#define rounded_up_division(a, b) (((a) + (b - 1)) / (b))
@@ -393,7 +393,7 @@
"Efficiently clone, image, restore or rescue an NTFS Volume.\n\n"
"Copyright (c) 2003-2006 Szabolcs Szakacsits\n"
"Copyright (c) 2004-2006 Anton Altaparmakov\n"
- "Copyright (c) 2010-2016 Jean-Pierre Andre\n\n");
+ "Copyright (c) 2010-2018 Jean-Pierre Andre\n\n");
fprintf(stderr, "%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
exit(0);
}
@@ -756,7 +756,7 @@
static void copy_cluster(int rescue, u64 rescue_lcn, u64 lcn)
{
- char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
+ char *buff;
/* vol is NULL if opt.restore_image is set */
s32 csize = le32_to_cpu(image_hdr.cluster_size);
BOOL backup_bootsector;
@@ -783,6 +783,10 @@
}
}
+ buff = (char*)ntfs_malloc(csize);
+ if (!buff)
+ err_exit("Not enough memory");
+
// need reading when not about to write ?
if (read_all(fd, buff, csize) == -1) {
@@ -858,6 +862,7 @@
perr_printf("Write failed");
#endif
}
+ free(buff);
}
static s64 lseek_out(int fd, s64 pos, int mode)
@@ -995,7 +1000,11 @@
struct progress_bar *progress, u64 *p_counter)
{
s64 i;
- char buff[NTFS_MAX_CLUSTER_SIZE];
+ char *buff;
+
+ buff = (char*)ntfs_malloc(csize);
+ if (!buff)
+ err_exit("Not enough memory");
memset(buff, 0, csize);
@@ -1004,6 +1013,7 @@
perr_exit("write_all");
progress_update(progress, ++(*p_counter));
}
+ free(buff);
}
static void restore_image(void)
@@ -1492,7 +1502,7 @@
static void copy_wipe_mft(ntfs_walk_clusters_ctx *image, runlist *rl)
{
- char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
+ char *buff;
void *fd;
s64 mft_no;
u32 mft_record_size;
@@ -1522,6 +1532,10 @@
clusters_per_set = mft_record_size/csize;
records_per_set = 1;
}
+ buff = (char*)ntfs_malloc(mft_record_size);
+ if (!buff)
+ err_exit("Not enough memory");
+
mft_no = 0;
ri = rj = 0;
wi = wj = 0;
@@ -1554,6 +1568,7 @@
}
}
image->current_lcn = current_lcn;
+ free(buff);
}
/*
@@ -1566,7 +1581,7 @@
static void copy_wipe_i30(ntfs_walk_clusters_ctx *image, runlist *rl)
{
- char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
+ char *buff;
void *fd;
u32 indx_record_size;
u32 csize;
@@ -1595,6 +1610,10 @@
clusters_per_set = indx_record_size/csize;
records_per_set = 1;
}
+ buff = (char*)ntfs_malloc(indx_record_size);
+ if (!buff)
+ err_exit("Not enough memory");
+
ri = rj = 0;
wi = wj = 0;
if (rl[ri].length)
@@ -1627,6 +1646,7 @@
}
}
image->current_lcn = current_lcn;
+ free(buff);
}
static void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl)
--- a/ntfsprogs/ntfsresize.c.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/ntfsprogs/ntfsresize.c 2018-05-07 09:11:13.076883400 +0200
@@ -59,6 +59,7 @@
#include <fcntl.h>
#endif
+#include "param.h"
#include "debug.h"
#include "types.h"
#include "support.h"
@@ -243,8 +244,6 @@
#define DIRTY_INODE (1)
#define DIRTY_ATTRIB (2)
-#define NTFS_MAX_CLUSTER_SIZE (65536)
-
static s64 rounded_up_division(s64 numer, s64 denom)
{
return (numer + (denom - 1)) / denom;
@@ -404,7 +403,7 @@
printf("Copyright (c) 2002-2005 Anton Altaparmakov\n");
printf("Copyright (c) 2002-2003 Richard Russon\n");
printf("Copyright (c) 2007 Yura Pakhuchiy\n");
- printf("Copyright (c) 2011-2016 Jean-Pierre Andre\n");
+ printf("Copyright (c) 2011-2018 Jean-Pierre Andre\n");
printf("\n%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
}
@@ -1849,9 +1848,13 @@
static void copy_clusters(ntfs_resize_t *resize, s64 dest, s64 src, s64 len)
{
s64 i;
- char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
+ char *buff;
ntfs_volume *vol = resize->vol;
+ buff = (char*)ntfs_malloc(vol->cluster_size);
+ if (!buff)
+ perr_exit("ntfs_malloc");
+
for (i = 0; i < len; i++) {
lseek_to_cluster(vol, src + i);
@@ -1875,6 +1878,7 @@
resize->relocations++;
progress_update(&resize->progress, resize->relocations);
}
+ free(buff);
}
static void relocate_clusters(ntfs_resize_t *r, runlist *dest_rl, s64 src_lcn)
--- a/include/ntfs-3g/param.h.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/include/ntfs-3g/param.h 2018-05-07 09:11:13.088302600 +0200
@@ -40,6 +40,13 @@
};
/*
+ * Parameters for formatting
+ */
+
+ /* Up to Windows 10, the cluster size was limited to 64K */
+#define NTFS_MAX_CLUSTER_SIZE 2097152 /* Windows 10 Creators allows 2MB */
+
+/*
* Parameters for compression
*/

View File

@ -1,12 +0,0 @@
--- a/libntfs-3g/volume.c.ref 2017-03-23 10:42:44.000000000 +0100
+++ b/libntfs-3g/volume.c 2017-12-20 08:11:51.842424300 +0100
@@ -959,7 +959,8 @@
vol->mftmirr_size = l;
}
ntfs_log_debug("Comparing $MFTMirr to $MFT...\n");
- for (i = 0; i < vol->mftmirr_size; ++i) {
+ /* Windows 10 does not update the full $MFTMirr any more */
+ for (i = 0; (i < vol->mftmirr_size) && (i < FILE_first_user); ++i) {
MFT_RECORD *mrec, *mrec2;
const char *ESTR[12] = { "$MFT", "$MFTMirr", "$LogFile",
"$Volume", "$AttrDef", "root directory", "$Bitmap",

View File

@ -1,81 +0,0 @@
--- a/ntfsprogs/ntfsclone.c 2018-05-16 18:46:47.114964000 +0200
+++ b/ntfsprogs/ntfsclone.c 2018-07-16 14:03:20.273809100 +0200
@@ -776,6 +776,10 @@
/* possible partial cluster holding the backup boot sector */
backup_bootsector = (lcn + 1)*csize >= full_device_size;
+ buff = (char*)ntfs_malloc(csize);
+ if (!buff)
+ err_exit("Not enough memory");
+
if (backup_bootsector) {
csize = full_device_size - lcn*csize;
if (csize < 0) {
@@ -783,10 +787,6 @@
}
}
- buff = (char*)ntfs_malloc(csize);
- if (!buff)
- err_exit("Not enough memory");
-
// need reading when not about to write ?
if (read_all(fd, buff, csize) == -1) {
@@ -1507,6 +1507,7 @@
s64 mft_no;
u32 mft_record_size;
u32 csize;
+ u32 buff_size;
u32 bytes_per_sector;
u32 records_per_set;
u32 clusters_per_set;
@@ -1524,15 +1525,18 @@
/*
* Depending on the sizes, there may be several records
* per cluster, or several clusters per record.
+ * Anyway, full clusters are needed for rescuing bad ones.
*/
if (csize >= mft_record_size) {
records_per_set = csize/mft_record_size;
clusters_per_set = 1;
+ buff_size = csize;
} else {
clusters_per_set = mft_record_size/csize;
records_per_set = 1;
+ buff_size = mft_record_size;
}
- buff = (char*)ntfs_malloc(mft_record_size);
+ buff = (char*)ntfs_malloc(buff_size);
if (!buff)
err_exit("Not enough memory");
@@ -1585,6 +1589,7 @@
void *fd;
u32 indx_record_size;
u32 csize;
+ u32 buff_size;
u32 bytes_per_sector;
u32 records_per_set;
u32 clusters_per_set;
@@ -1601,16 +1606,19 @@
/*
* Depending on the sizes, there may be several records
* per cluster, or several clusters per record.
+ * Anyway, full clusters are needed for rescuing bad ones.
*/
indx_record_size = image->ni->vol->indx_record_size;
if (csize >= indx_record_size) {
records_per_set = csize/indx_record_size;
clusters_per_set = 1;
+ buff_size = csize;
} else {
clusters_per_set = indx_record_size/csize;
records_per_set = 1;
+ buff_size = indx_record_size;
}
- buff = (char*)ntfs_malloc(indx_record_size);
+ buff = (char*)ntfs_malloc(buff_size);
if (!buff)
err_exit("Not enough memory");