Author: bonefish Date: 2010-04-26 23:16:36 +0200 (Mon, 26 Apr 2010) New Revision: 36497 Changeset: http://dev.haiku-os.org/changeset/36497/haiku Modified: haiku/trunk/src/system/kernel/debug/debug.cpp Log: * kernel_debugger_loop(): Don't access sSyslogBuffer without checking whether it is non-NULL first. * syslog_init_post_vm(): Make sure the area for the debug syslog could actually be created and fail otherwise. * syslog_init_post_threads(): Fixed the cleanup on error. In case of a debug syslog we need to delete the respective area instead of free()ing the memory. Modified: haiku/trunk/src/system/kernel/debug/debug.cpp =================================================================== --- haiku/trunk/src/system/kernel/debug/debug.cpp 2010-04-26 17:11:11 UTC (rev 36496) +++ haiku/trunk/src/system/kernel/debug/debug.cpp 2010-04-26 21:16:36 UTC (rev 36497) @@ -101,6 +101,7 @@ static size_t sSyslogBufferOffset = 0; // (relative) buffer offset of the yet unsent syslog messages static bool sSyslogDropped = false; +static bool sDebugSyslog = false; static size_t sSyslogDebuggerOffset = 0; // (relative) buffer offset of the kernel debugger messages of the current // KDL session @@ -805,7 +806,8 @@ if (sCurrentKernelDebuggerMessage != NULL) va_copy(sCurrentKernelDebuggerMessageArgs, args); - sSyslogDebuggerOffset = ring_buffer_readable(sSyslogBuffer); + sSyslogDebuggerOffset = sSyslogBuffer != NULL + ? ring_buffer_readable(sSyslogBuffer) : 0; print_kernel_debugger_message(); @@ -1298,8 +1300,15 @@ // initializing kernel syslog service failed -- disable it sSyslogOutputEnabled = false; + + if (sSyslogBuffer != NULL) { + if (sDebugSyslog) + delete_area(area_for(sSyslogBuffer)); + else + delete_ring_buffer(sSyslogBuffer); + } + free(sSyslogMessage); - free(sSyslogBuffer); delete_sem(sSyslogNotify); return B_ERROR; @@ -1348,8 +1357,13 @@ // create an area for the debug syslog buffer void* base = (void*)ROUNDDOWN((addr_t)args->debug_output, B_PAGE_SIZE); size_t size = ROUNDUP(args->debug_size, B_PAGE_SIZE); - create_area("syslog debug", &base, B_EXACT_ADDRESS, size, - B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); + area_id area = create_area("syslog debug", &base, B_EXACT_ADDRESS, size, + B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); + if (area < 0) { + sSyslogBuffer = NULL; + status = B_NO_MEMORY; + goto err2; + } } // initialize syslog message @@ -1396,6 +1410,7 @@ sSyslogBuffer = create_ring_buffer_etc(args->debug_output, args->debug_size, RING_BUFFER_INIT_FROM_BUFFER); + sDebugSyslog = true; return B_OK; }