|
Kmods SIG |
63c143 |
From 8607954cf255329d1c6dfc073ff1508b7585573c Mon Sep 17 00:00:00 2001
|
|
Kmods SIG |
63c143 |
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
|
Kmods SIG |
63c143 |
Date: Mon, 11 Oct 2021 19:43:29 +0300
|
|
Kmods SIG |
63c143 |
Subject: [Backport 8607954cf255] src: Check for NULL pointers in
|
|
Kmods SIG |
63c143 |
ni_try_remove_attr_list
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
Check for potential NULL pointers.
|
|
Kmods SIG |
63c143 |
Print error message if found.
|
|
Kmods SIG |
63c143 |
Thread, that leads to this commit:
|
|
Kmods SIG |
63c143 |
https://lore.kernel.org/ntfs3/227c13e3-5a22-0cba-41eb-fcaf41940711@paragon-software.com/
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
Reported-by: Mohammad Rasim <mohammad.rasim96@gmail.com>
|
|
Kmods SIG |
63c143 |
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
|
Kmods SIG |
63c143 |
---
|
|
Kmods SIG |
63c143 |
src/frecord.c | 23 ++++++++++++++++++++++-
|
|
Kmods SIG |
63c143 |
1 file changed, 22 insertions(+), 1 deletion(-)
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
diff --git a/src/frecord.c b/src/frecord.c
|
|
Kmods SIG |
63c143 |
index ecb965e4afd075e2e38be7dfda7ad71f3ff1e150..6f47a9c17f896c62e355db7a6948075a88247378 100644
|
|
Kmods SIG |
63c143 |
--- a/src/frecord.c
|
|
Kmods SIG |
63c143 |
+++ b/src/frecord.c
|
|
Kmods SIG |
63c143 |
@@ -705,18 +705,35 @@ static int ni_try_remove_attr_list(struct ntfs_inode *ni)
|
|
Kmods SIG |
63c143 |
continue;
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
mi = ni_find_mi(ni, ino_get(&le->ref));
|
|
Kmods SIG |
63c143 |
+ if (!mi) {
|
|
Kmods SIG |
63c143 |
+ /* Should never happened, 'cause already checked. */
|
|
Kmods SIG |
63c143 |
+ goto bad;
|
|
Kmods SIG |
63c143 |
+ }
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
attr = mi_find_attr(mi, NULL, le->type, le_name(le),
|
|
Kmods SIG |
63c143 |
le->name_len, &le->id);
|
|
Kmods SIG |
63c143 |
+ if (!attr) {
|
|
Kmods SIG |
63c143 |
+ /* Should never happened, 'cause already checked. */
|
|
Kmods SIG |
63c143 |
+ goto bad;
|
|
Kmods SIG |
63c143 |
+ }
|
|
Kmods SIG |
63c143 |
asize = le32_to_cpu(attr->size);
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/* Insert into primary record. */
|
|
Kmods SIG |
63c143 |
attr_ins = mi_insert_attr(&ni->mi, le->type, le_name(le),
|
|
Kmods SIG |
63c143 |
le->name_len, asize,
|
|
Kmods SIG |
63c143 |
le16_to_cpu(attr->name_off));
|
|
Kmods SIG |
63c143 |
- id = attr_ins->id;
|
|
Kmods SIG |
63c143 |
+ if (!attr_ins) {
|
|
Kmods SIG |
63c143 |
+ /*
|
|
Kmods SIG |
63c143 |
+ * Internal error.
|
|
Kmods SIG |
63c143 |
+ * Either no space in primary record (already checked).
|
|
Kmods SIG |
63c143 |
+ * Either tried to insert another
|
|
Kmods SIG |
63c143 |
+ * non indexed attribute (logic error).
|
|
Kmods SIG |
63c143 |
+ */
|
|
Kmods SIG |
63c143 |
+ goto bad;
|
|
Kmods SIG |
63c143 |
+ }
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/* Copy all except id. */
|
|
Kmods SIG |
63c143 |
+ id = attr_ins->id;
|
|
Kmods SIG |
63c143 |
memcpy(attr_ins, attr, asize);
|
|
Kmods SIG |
63c143 |
attr_ins->id = id;
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
@@ -732,6 +749,10 @@ static int ni_try_remove_attr_list(struct ntfs_inode *ni)
|
|
Kmods SIG |
63c143 |
ni->attr_list.dirty = false;
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
return 0;
|
|
Kmods SIG |
63c143 |
+bad:
|
|
Kmods SIG |
63c143 |
+ ntfs_inode_err(&ni->vfs_inode, "Internal error");
|
|
Kmods SIG |
63c143 |
+ make_bad_inode(&ni->vfs_inode);
|
|
Kmods SIG |
63c143 |
+ return -EINVAL;
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/*
|
|
Kmods SIG |
63c143 |
--
|
|
Kmods SIG |
63c143 |
2.31.1
|
|
Kmods SIG |
63c143 |
|