Made a double check before creating the first security id

N2009_11_14_FIXES
jpandre 2007-10-18 16:05:33 +00:00
parent 86084908e2
commit 62407b6b1e
1 changed files with 34 additions and 15 deletions

View File

@ -997,6 +997,7 @@ static le32 entersecurityattr(ntfs_volume *vol,
INDEX_ENTRY *entry;
INDEX_ENTRY *next;
ntfs_index_context *xsii;
ntfs_attr *na;
/* find the first available securid beyond the last key */
/* in $Secure:$SII. This also determines the first */
@ -1053,10 +1054,24 @@ static le32 entersecurityattr(ntfs_volume *vol,
}
}
if (!keyid) {
/* assume we could have to insert the first entry */
/* (after upgrading from an old version ?) */
ntfs_log_error("Creating the first security_id\n");
securid = cpu_to_le32(FIRST_SECURITY_ID);
/*
* could not find any entry, before creating the first
* entry, make a double check by making sure size of $SII
* is less than needed for one entry
*/
securid = cpu_to_le32(0);
na = ntfs_attr_open(vol->secure_ni,AT_INDEX_ROOT,sii_stream,4);
if (na) {
if (na->data_size < sizeof(struct SII)) {
ntfs_log_error("Creating the first security_id\n");
securid = cpu_to_le32(FIRST_SECURITY_ID);
}
ntfs_attr_close(na);
}
if (!securid) {
ntfs_log_error("Error creating a security_id\n");
errno = EIO;
}
} else
securid = cpu_to_le32(le32_to_cpu(keyid) + 1);
/*
@ -1066,14 +1081,17 @@ static le32 entersecurityattr(ntfs_volume *vol,
* the second copy. So align to next block when
* the last byte overflows on a wrong block.
*/
offs += ((size - 1) | (ALIGN_SDS_ENTRY - 1)) + 1;
if ((offs + attrsz + sizeof(SECURITY_DESCRIPTOR_HEADER) - 1)
& ALIGN_SDS_BLOCK) {
offs = ((offs + attrsz
+ sizeof(SECURITY_DESCRIPTOR_HEADER) - 1)
| (ALIGN_SDS_BLOCK - 1)) + 1;
entersecurity_stuff(vol, offs);
}
if (securid) {
offs += ((size - 1) | (ALIGN_SDS_ENTRY - 1)) + 1;
if ((offs + attrsz + sizeof(SECURITY_DESCRIPTOR_HEADER) - 1)
& ALIGN_SDS_BLOCK) {
offs = ((offs + attrsz
+ sizeof(SECURITY_DESCRIPTOR_HEADER) - 1)
| (ALIGN_SDS_BLOCK - 1)) + 1;
}
if (!(offs & (ALIGN_SDS_BLOCK - 1)))
entersecurity_stuff(vol, offs);
/*
* now write the security attr to storage :
* first data, then SII, then SDH
@ -1086,9 +1104,10 @@ static le32 entersecurityattr(ntfs_volume *vol,
* in SDS or SII will not be reused, an inconsistency
* will persist with no significant consequence
*/
if (entersecurity_data(vol, attr, attrsz, hash, securid, offs)
|| entersecurity_indexes(vol, attrsz, hash, securid, offs))
securid = cpu_to_le32(0);
if (entersecurity_data(vol, attr, attrsz, hash, securid, offs)
|| entersecurity_indexes(vol, attrsz, hash, securid, offs))
securid = cpu_to_le32(0);
}
/* inode now is dirty, synchronize it all */
ntfs_index_ctx_reinit(vol->secure_xsii);
ntfs_index_ctx_reinit(vol->secure_xsdh);