diff --git a/ntfs-3g-junction-point-fix.patch b/ntfs-3g-junction-point-fix.patch new file mode 100644 index 0000000..90c72ae --- /dev/null +++ b/ntfs-3g-junction-point-fix.patch @@ -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__) + /* diff --git a/ntfs-3g.spec b/ntfs-3g.spec index b3ecb67..2578eb1 100644 --- a/ntfs-3g.spec +++ b/ntfs-3g.spec @@ -8,7 +8,7 @@ Name: ntfs-3g Summary: Linux NTFS userspace driver Version: 2012.1.15 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://tuxera.com/opensource/%{name}_ntfsprogs-%{version}%{?subver}.tgz @@ -26,6 +26,7 @@ Provides: ntfsprogs-fuse = %{epoch}:%{version}-%{release} Obsoletes: ntfsprogs-fuse Provides: fuse-ntfs-3g = %{epoch}:%{version}-%{release} Patch0: ntfs-3g_ntfsprogs-2011.10.9-RC-ntfsck-unsupported-return-0.patch +Patch1: ntfs-3g-junction-point-fix.patch %description 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 %setup -q -n %{name}_ntfsprogs-%{version}%{?subver} %patch0 -p1 -b .unsupported +%patch1 -p1 -b .junction-fix %build 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* %changelog +* Sun Aug 19 2012 Tom Callaway - 2:2012.1.15-3 +- apply upstream fix for junction points (bz849332) + * Fri Jul 20 2012 Fedora Release Engineering - 2:2012.1.15-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild