add junction point fix (bz849332)

epel9
Tom Callaway 13 years ago
parent 056b0e3c05
commit 8fb7f2d11f

@ -0,0 +1,187 @@
--- ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/dir.c.ref 2012-08-18 09:46:22.000000000 +0200
+++ ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/dir.c 2012-08-18 11:07:57.000000000 +0200
@@ -867,6 +867,83 @@
INDEX_TYPE_ALLOCATION, /* index allocation */
} INDEX_TYPE;
+/*
+ * Decode Interix file types
+ *
+ * Non-Interix types are returned as plain files, because a
+ * Windows user may force patterns very similar to Interix.
+ */
+
+static u32 ntfs_interix_types(ntfs_inode *ni)
+{
+ ntfs_attr *na;
+ u32 dt_type;
+ le64 magic;
+
+ dt_type = NTFS_DT_UNKNOWN;
+ na = ntfs_attr_open(ni, AT_DATA, NULL, 0);
+ if (na) {
+ /* Unrecognized patterns (eg HID + SYST) are plain files */
+ dt_type = NTFS_DT_REG;
+ if (na->data_size <= 1) {
+ if (!(ni->flags & FILE_ATTR_HIDDEN))
+ dt_type = (na->data_size ?
+ NTFS_DT_SOCK : NTFS_DT_FIFO);
+ } else {
+ if ((na->data_size >= (s64)sizeof(magic))
+ && (ntfs_attr_pread(na, 0, sizeof(magic), &magic)
+ == sizeof(magic))) {
+ if (magic == INTX_SYMBOLIC_LINK)
+ dt_type = NTFS_DT_LNK;
+ else if (magic == INTX_BLOCK_DEVICE)
+ dt_type = NTFS_DT_BLK;
+ else if (magic == INTX_CHARACTER_DEVICE)
+ dt_type = NTFS_DT_CHR;
+ }
+ }
+ ntfs_attr_close(na);
+ }
+ return (dt_type);
+}
+
+/*
+ * Decode file types
+ *
+ * Better only use for Interix types and junctions,
+ * unneeded complexity when used for plain files or directories
+ *
+ * Error cases are logged and returned as unknown.
+ */
+
+static u32 ntfs_dir_entry_type(ntfs_inode *dir_ni, MFT_REF mref, FILE_ATTR_FLAGS attributes)
+{
+ ntfs_inode *ni;
+ u32 dt_type;
+
+ dt_type = NTFS_DT_UNKNOWN;
+ ni = ntfs_inode_open(dir_ni->vol, mref);
+ if (ni) {
+ if ((attributes & FILE_ATTR_REPARSE_POINT)
+ && ntfs_possible_symlink(ni))
+ dt_type = NTFS_DT_LNK;
+ else
+ if ((attributes & FILE_ATTR_SYSTEM)
+ && !(attributes & FILE_ATTR_I30_INDEX_PRESENT))
+ dt_type = ntfs_interix_types(ni);
+ else
+ dt_type = (attributes
+ & FILE_ATTR_I30_INDEX_PRESENT
+ ? NTFS_DT_DIR : NTFS_DT_REG);
+ if (ntfs_inode_close(ni)) {
+ /* anything special to do ? */
+ }
+ }
+ if (dt_type == NTFS_DT_UNKNOWN)
+ ntfs_log_error("Could not decode the type of inode %lld\n",
+ (long long)MREF(mref));
+ return (dt_type);
+}
+
/**
* ntfs_filldir - ntfs specific filldir method
* @dir_ni: ntfs inode of current directory
@@ -901,19 +978,23 @@
dir_ni->vol->mft_record_size;
else /* if (index_type == INDEX_TYPE_ROOT) */
*pos = (u8*)ie - (u8*)iu.ir;
+ mref = le64_to_cpu(ie->indexed_file);
+ metadata = (MREF(mref) != FILE_root) && (MREF(mref) < FILE_first_user);
/* Skip root directory self reference entry. */
if (MREF_LE(ie->indexed_file) == FILE_root)
return 0;
- if (ie->key.file_name.file_attributes & FILE_ATTR_I30_INDEX_PRESENT)
+ if ((ie->key.file_name.file_attributes
+ & (FILE_ATTR_REPARSE_POINT | FILE_ATTR_SYSTEM))
+ && !metadata)
+ dt_type = ntfs_dir_entry_type(dir_ni, mref,
+ ie->key.file_name.file_attributes);
+ else if (ie->key.file_name.file_attributes
+ & FILE_ATTR_I30_INDEX_PRESENT)
dt_type = NTFS_DT_DIR;
- else if (fn->file_attributes & FILE_ATTR_SYSTEM)
- dt_type = NTFS_DT_UNKNOWN;
else
dt_type = NTFS_DT_REG;
/* return metadata files and hidden files if requested */
- mref = le64_to_cpu(ie->indexed_file);
- metadata = (MREF(mref) != FILE_root) && (MREF(mref) < FILE_first_user);
if ((!metadata && (NVolShowHidFiles(dir_ni->vol)
|| !(fn->file_attributes & FILE_ATTR_HIDDEN)))
|| (NVolShowSysFiles(dir_ni->vol) && (NVolShowHidFiles(dir_ni->vol)
--- ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.c.ref 2012-08-18 09:44:57.000000000 +0200
+++ ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.c 2012-08-18 09:47:41.000000000 +0200
@@ -1017,10 +1017,30 @@
} else {
struct stat st = { .st_ino = MREF(mref) };
- if (dt_type == NTFS_DT_REG)
- st.st_mode = S_IFREG | (0777 & ~ctx->fmask);
- else if (dt_type == NTFS_DT_DIR)
+ switch (dt_type) {
+ case NTFS_DT_DIR :
st.st_mode = S_IFDIR | (0777 & ~ctx->dmask);
+ break;
+ case NTFS_DT_LNK :
+ st.st_mode = S_IFLNK | 0777;
+ break;
+ case NTFS_DT_FIFO :
+ st.st_mode = S_IFIFO;
+ break;
+ case NTFS_DT_SOCK :
+ st.st_mode = S_IFSOCK;
+ break;
+ case NTFS_DT_BLK :
+ st.st_mode = S_IFBLK;
+ break;
+ case NTFS_DT_CHR :
+ st.st_mode = S_IFCHR;
+ break;
+ default : /* unexpected types shown as plain files */
+ case NTFS_DT_REG :
+ st.st_mode = S_IFREG | (0777 & ~ctx->fmask);
+ break;
+ }
#if defined(__APPLE__) || defined(__DARWIN__)
/*
--- ntfs-3g_ntfsprogs-2012.1.15/src/lowntfs-3g.c.ref 2012-08-18 09:44:57.000000000 +0200
+++ ntfs-3g_ntfsprogs-2012.1.15/src/lowntfs-3g.c 2012-08-18 09:47:41.000000000 +0200
@@ -920,10 +920,30 @@
if (MREF(mref) > 1) {
struct stat st = { .st_ino = MREF(mref) };
- if (dt_type == NTFS_DT_REG)
- st.st_mode = S_IFREG | (0777 & ~ctx->fmask);
- else if (dt_type == NTFS_DT_DIR)
+ switch (dt_type) {
+ case NTFS_DT_DIR :
st.st_mode = S_IFDIR | (0777 & ~ctx->dmask);
+ break;
+ case NTFS_DT_LNK :
+ st.st_mode = S_IFLNK | 0777;
+ break;
+ case NTFS_DT_FIFO :
+ st.st_mode = S_IFIFO;
+ break;
+ case NTFS_DT_SOCK :
+ st.st_mode = S_IFSOCK;
+ break;
+ case NTFS_DT_BLK :
+ st.st_mode = S_IFBLK;
+ break;
+ case NTFS_DT_CHR :
+ st.st_mode = S_IFCHR;
+ break;
+ default : /* unexpected types shown as plain files */
+ case NTFS_DT_REG :
+ st.st_mode = S_IFREG | (0777 & ~ctx->fmask);
+ break;
+ }
#if defined(__APPLE__) || defined(__DARWIN__)
/*

@ -8,7 +8,7 @@
Name: ntfs-3g Name: ntfs-3g
Summary: Linux NTFS userspace driver Summary: Linux NTFS userspace driver
Version: 2012.1.15 Version: 2012.1.15
Release: 2%{?dist} Release: 3%{?dist}
License: GPLv2+ License: GPLv2+
Group: System Environment/Base Group: System Environment/Base
Source0: http://tuxera.com/opensource/%{name}_ntfsprogs-%{version}%{?subver}.tgz Source0: http://tuxera.com/opensource/%{name}_ntfsprogs-%{version}%{?subver}.tgz
@ -26,6 +26,7 @@ Provides: ntfsprogs-fuse = %{epoch}:%{version}-%{release}
Obsoletes: ntfsprogs-fuse Obsoletes: ntfsprogs-fuse
Provides: fuse-ntfs-3g = %{epoch}:%{version}-%{release} Provides: fuse-ntfs-3g = %{epoch}:%{version}-%{release}
Patch0: ntfs-3g_ntfsprogs-2011.10.9-RC-ntfsck-unsupported-return-0.patch Patch0: ntfs-3g_ntfsprogs-2011.10.9-RC-ntfsck-unsupported-return-0.patch
Patch1: ntfs-3g-junction-point-fix.patch
%description %description
NTFS-3G is a stable, open source, GPL licensed, POSIX, read/write NTFS NTFS-3G is a stable, open source, GPL licensed, POSIX, read/write NTFS
@ -67,6 +68,7 @@ included utilities see man 8 ntfsprogs after installation).
%prep %prep
%setup -q -n %{name}_ntfsprogs-%{version}%{?subver} %setup -q -n %{name}_ntfsprogs-%{version}%{?subver}
%patch0 -p1 -b .unsupported %patch0 -p1 -b .unsupported
%patch1 -p1 -b .junction-fix
%build %build
CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64" CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64"
@ -168,6 +170,9 @@ cp -a %{SOURCE1} %{buildroot}%{_datadir}/hal/fdi/policy/10osvendor/
%{_mandir}/man8/ntfs[^m][^o]*.8* %{_mandir}/man8/ntfs[^m][^o]*.8*
%changelog %changelog
* Sun Aug 19 2012 Tom Callaway <spot@fedoraproject.org> - 2:2012.1.15-3
- apply upstream fix for junction points (bz849332)
* Fri Jul 20 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:2012.1.15-2 * Fri Jul 20 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:2012.1.15-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild

Loading…
Cancel
Save