early_res: Need to save the allocation name in drop_range_partial()
During free_early_partial(), reserve_early_without_check() could end
extending the early_res area from __check_and_double_early_res(); as a
result, the location of the name for the current reservation could
change.
Therefore, we need to save a local copy of the name.
[ hpa: rewrote comment and checkin description ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <4B8C7C94.7070000@kernel.org>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
diff --git a/kernel/early_res.c b/kernel/early_res.c
index 9ab11cd..3cb2c66 100644
--- a/kernel/early_res.c
+++ b/kernel/early_res.c
@@ -79,9 +79,19 @@
/* make head segment */
early_res[i].end = common_start;
if (old_end > common_end) {
+ char name[15];
+
+ /*
+ * Save a local copy of the name, since the
+ * early_res array could get resized inside
+ * reserve_early_without_check() ->
+ * __check_and_double_early_res(), which would
+ * make the current name pointer invalid.
+ */
+ strncpy(name, early_res[i].name,
+ sizeof(early_res[i].name) - 1);
/* add another for left over on tail */
- reserve_early_without_check(common_end, old_end,
- early_res[i].name);
+ reserve_early_without_check(common_end, old_end, name);
}
return;
} else {