From 10fbb5f7fd1e6c4628644ad1970cd398f8f93cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 16 Nov 2005 17:01:45 +0000 Subject: [PATCH] The driver settings in the boot loader overwrote the settings for later kernel use; they could not be parsed again by the kernel, and thus, safemode was not working anymore (as it was queried by the SMP stuff). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14960 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/libroot/os/driver_settings.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/system/libroot/os/driver_settings.c b/src/system/libroot/os/driver_settings.c index 7b6ef97b53..9a3c5dce76 100644 --- a/src/system/libroot/os/driver_settings.c +++ b/src/system/libroot/os/driver_settings.c @@ -379,12 +379,7 @@ free_settings(settings_handle *handle) free_parameter(&handle->settings.parameters[i]); free(handle->settings.parameters); - -#ifndef _BOOT_MODE - // in the boot loader we either don't care (because the heap is dumped anyway) - // or must not free the text if we want to pass the buffer over to the kernel free(handle->text); -#endif free(handle); } @@ -629,7 +624,7 @@ driver_settings_init(kernel_args *args) // Move the preloaded driver settings over to the kernel list_init(&sHandles); - + while (settings != NULL) { settings_handle *handle = malloc(sizeof(settings_handle)); if (handle == NULL) @@ -688,6 +683,7 @@ unload_driver_settings(void *handle) if (handle != NULL) free_settings(handle); + return B_OK; } @@ -735,8 +731,14 @@ load_driver_settings(const char *driverName) struct driver_settings_file *settings = gKernelArgs.driver_settings; while (settings != NULL) { if (!strcmp(settings->name, driverName)) { - // we have it - return new_settings(settings->buffer, driverName); + // we have it - since the buffer is clobbered, we have to + // copy its contents, though + char *text = malloc(settings->size + 1); + if (text == NULL) + return NULL; + + memcpy(text, settings->buffer, settings->size + 1); + return new_settings(text, driverName); } settings = settings->next; }