]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
early_res: Need to save the allocation name in drop_range_partial()
authorYinghai Lu <yinghai@kernel.org>
Tue, 2 Mar 2010 02:48:52 +0000 (18:48 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 2 Mar 2010 07:23:02 +0000 (23:23 -0800)
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>
kernel/early_res.c

index 9ab11cd84853a1876544ff1b629edbbed3cb99d4..3cb2c661bb781ab5468a54e58a106cdb14269a7b 100644 (file)
@@ -79,9 +79,19 @@ static void __init drop_range_partial(int i, u64 start, u64 end)
                /* 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 {