[Ocfs2-tools-devel] [PATCH] mounted.ocfs2: check length of names in ocfs2_print_nodes()
Coly Li
coly.li at suse.de
Thu Mar 12 10:25:36 PDT 2009
This patch is original from "[RFC] PATCH: verify slot number in
_ocfs2_read_slot_map(), v2". Thanks to Sunil and Joel for their comments and review.
In some buggy conditions, mounted.ocfs2 does dirty reads, when it happens, in
ocfs2_print_nodes():
66 node_num = map->md_slots[i].sd_node_num;
67 if (names && names[node_num] && *(names[node_num]))
node_num in 66 may be a very large number (due to the invalid data from
__ocfs2_read_slot_map()), and names[node_num] references to an illegal memory
region.
This patch adds third parameter 'length_of_names'to ocfs2_print_nodes(), when
node_num >= length_of_names, mounted.ocfs2 will display error message in this style:
# mounted.ocfs2 -f
Device FS Nodes
/dev/hdb1 ocfs2 Unknown
As Joel mentioned, this patch only fixes current o2cb stack issue. More work is
needed to make a completely solution for both o2cb and user space cluster stacks.
Signed-off-by: Coly Li <coly.li at suse.de>
---
mounted.ocfs2/mounted.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/mounted.ocfs2/mounted.c b/mounted.ocfs2/mounted.c
index 2b5550f..6ce3eb6 100644
--- a/mounted.ocfs2/mounted.c
+++ b/mounted.ocfs2/mounted.c
@@ -48,7 +48,8 @@ static char *usage_string =
" -d quick detect\n"
" -f full detect\n";
-static void ocfs2_print_nodes(ocfs2_devices *dev, char **names)
+static void ocfs2_print_nodes(ocfs2_devices *dev, char **names,
+ unsigned int length_of_names)
{
int i, start = 1;
unsigned int node_num;
@@ -64,7 +65,10 @@ static void ocfs2_print_nodes(ocfs2_devices *dev, char **names)
printf(", ");
node_num = map->md_slots[i].sd_node_num;
- if (names && names[node_num] && *(names[node_num]))
+
+ if (node_num >= length_of_names)
+ printf("Unknown");
+ else if (names && names[node_num] && *(names[node_num]))
printf("%s", names[node_num]);
else
printf("%d", node_num);
@@ -116,7 +120,7 @@ static void ocfs2_print_full_detect(struct list_head *dev_list)
if (dev->hb_dev)
printf("Heartbeat device");
else if (dev->mount_flags & OCFS2_MF_MOUNTED_CLUSTER)
- ocfs2_print_nodes(dev, nodes);
+ ocfs2_print_nodes(dev, nodes, i);
else
printf("Not mounted");
printf("\n");
--
Coly Li
SuSE Labs
More information about the Ocfs2-tools-devel
mailing list