Fixed filtering of junction points

N2009_11_14_FIXES
jpandre 2008-11-04 13:36:08 +00:00
parent 33bccc53c9
commit 4c39b0332f
2 changed files with 32 additions and 16 deletions

View File

@ -115,6 +115,7 @@ static u64 ntfs_fix_file_name(ntfs_inode *dir_ni, ntfschar *uname,
u64 mref;
le64 lemref;
int lkup;
int olderrno;
int i;
FILE_NAME_ATTR *found;
struct {
@ -132,7 +133,10 @@ static u64 ntfs_fix_file_name(ntfs_inode *dir_ni, ntfschar *uname,
find.attr.file_name[i] = vol->upcase[uname[i]];
else
find.attr.file_name[i] = uname[i];
olderrno = errno;
lkup = ntfs_index_lookup(&find, uname_len, icx);
if (errno == ENOENT)
errno = olderrno;
found = (FILE_NAME_ATTR*)icx->data;
/*
* We generally only get the first matching candidate,
@ -397,6 +401,11 @@ char *ntfs_junction_point(ntfs_volume *vol, const char *org_path,
reparse_attr = (REPARSE_POINT*)ntfs_attr_readall(ni,
AT_REPARSE_POINT,(ntfschar*)NULL, 0, &attr_size);
if (reparse_attr && attr_size) {
/*
* reparse_tag 0xa000000c has been found for
* \Users\All Users
* (not supported until properly understood)
*/
if (reparse_attr->reparse_tag == IO_REPARSE_TAG_MOUNT_POINT) {
path_data = (struct SYMLNK_REPARSE_DATA*)reparse_attr->reparse_data;
offs = le16_to_cpu(path_data->subst_name_offset);

View File

@ -578,25 +578,32 @@ static int ntfs_fuse_readlink(const char *org_path, char *buf, size_t buf_size)
if (!ni) {
res = -errno;
goto exit;
}
/*
* Directory and reparse point : analyze as a
* junction point
*/
if ((ni->flags & FILE_ATTR_REPARSE_POINT)
&& (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)) {
char *target;
int attr_size;
errno = 0;
res = 0;
target = ntfs_junction_point(ctx->vol,org_path, ni, &attr_size);
if (target) {
strncpy(buf,target,buf_size);
free(target);
} else
if (errno == EOPNOTSUPP)
strcpy(buf,ntfs_bad_reparse);
else
res = -errno;
goto exit;
}
/* Sanity checks. */
if (!(ni->flags & FILE_ATTR_SYSTEM)) {
if (ni->flags & FILE_ATTR_REPARSE_POINT) {
char *target;
int attr_size;
errno = 0;
target = ntfs_junction_point(ctx->vol,org_path, ni, &attr_size);
if (target) {
strncpy(buf,target,buf_size);
free(target);
} else
if (errno == EOPNOTSUPP)
strcpy(buf,ntfs_bad_reparse);
else
res = -errno;
} else
res = -EINVAL;
res = -EINVAL;
goto exit;
}
na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);