From 2099f9392cc2b7e0892655d3c3a1081562457372 Mon Sep 17 00:00:00 2001 From: "flatcap.org!ntfs" Date: Wed, 16 Jun 2004 22:16:30 +0000 Subject: [PATCH] stop info crashing when it encounters a non-resident security attribute (Logical change 1.420) --- ntfsprogs/ntfsinfo.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/ntfsprogs/ntfsinfo.c b/ntfsprogs/ntfsinfo.c index a05fda38..6856ea80 100644 --- a/ntfsprogs/ntfsinfo.c +++ b/ntfsprogs/ntfsinfo.c @@ -664,16 +664,33 @@ static void ntfs_dump_acl(const char *prefix,ACL *acl) * * dump the security information about the file */ -static void ntfs_dump_attr_security_descriptor(ATTR_RECORD *attr) +static void ntfs_dump_attr_security_descriptor(ATTR_RECORD *attr, ntfs_volume *vol) { SECURITY_DESCRIPTOR_ATTR *sec_desc_attr; char *sid; - - sec_desc_attr = (SECURITY_DESCRIPTOR_ATTR *)((u8*)attr + - le16_to_cpu(attr->value_offset)); - - printf("Dumping attribute $SECURITY_DESCRIPTOR (0x50)\n"); + printf("Dumping attribute $SECURITY_DESCRIPTOR (0x50)\n"); + + if (attr->non_resident) { + runlist *rl = ntfs_mapping_pairs_decompress(vol, attr, 0); + if (rl) { + sec_desc_attr = malloc(attr->data_size); + s64 bytes_read = ntfs_rl_pread(vol, rl, 0, + attr->data_size, sec_desc_attr); + if (bytes_read != attr->data_size) { + Eprintf("ntfsinfo error: could not read secutiry descriptor\n"); + free(sec_desc_attr); + return; + } + } else { + Eprintf("ntfsinfo error: could not decompress runlist\n"); + return; + } + } else { + sec_desc_attr = (SECURITY_DESCRIPTOR_ATTR *)((u8*)attr + + le16_to_cpu(attr->value_offset)); + } + printf("\tRevision:\t\t %u\n",sec_desc_attr->revision); /* TODO: parse the flags */ @@ -713,6 +730,7 @@ static void ntfs_dump_attr_security_descriptor(ATTR_RECORD *attr) printf("missing\n"); } + if (attr->non_resident) free(sec_desc_attr); } /* @@ -1236,10 +1254,10 @@ static void ntfs_dump_file_attributes(ntfs_inode *inode) ntfs_dump_attr_file_name(ctx->attr); break; case AT_OBJECT_ID: - ntfs_dump_attr_object_id(ctx->attr,inode->vol); + ntfs_dump_attr_object_id(ctx->attr, inode->vol); break; case AT_SECURITY_DESCRIPTOR: - ntfs_dump_attr_security_descriptor(ctx->attr); + ntfs_dump_attr_security_descriptor(ctx->attr, inode->vol); break; case AT_VOLUME_NAME: ntfs_dump_attr_volume_name(ctx->attr);