mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Bug#16263506 - INNODB; USE ABORT() ON ALL PLATFORMS INSTEAD OF
DEREFERENCING UT_DBG_NULL_PTR The abort() call is standard C but InnoDB only uses it in GCC environments. UT_DBG_USE_ABORT is not defined the code crashed by dereferencing a null pointer instead of calling abort(). Other code throughout MySQL including ndb, sql, mysys and other places call abort() directly. This bug also affects innodb.innodb_bug14147491.test which fails randomly on windows because of this issue. Approved by marko in http://rb.no.oracle.com/rb/r/1936/
This commit is contained in:
parent
cc1a0d2ae2
commit
f3bfae1b67
3 changed files with 0 additions and 76 deletions
|
@ -55,47 +55,8 @@ ut_dbg_assertion_failed(
|
|||
ulint line) /*!< in: line number of the assertion */
|
||||
UNIV_COLD __attribute__((nonnull(2)));
|
||||
|
||||
#if defined(__WIN__) || defined(__INTEL_COMPILER)
|
||||
# undef UT_DBG_USE_ABORT
|
||||
#elif defined(__GNUC__) && (__GNUC__ > 2)
|
||||
# define UT_DBG_USE_ABORT
|
||||
#endif
|
||||
|
||||
#ifndef UT_DBG_USE_ABORT
|
||||
/** A null pointer that will be dereferenced to trigger a memory trap */
|
||||
extern ulint* ut_dbg_null_ptr;
|
||||
#endif
|
||||
|
||||
#if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT)
|
||||
/** If this is set to TRUE by ut_dbg_assertion_failed(), all threads
|
||||
will stop at the next ut_a() or ut_ad(). */
|
||||
extern ibool ut_dbg_stop_threads;
|
||||
|
||||
/*************************************************************//**
|
||||
Stop a thread after assertion failure. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
ut_dbg_stop_thread(
|
||||
/*===============*/
|
||||
const char* file,
|
||||
ulint line);
|
||||
#endif
|
||||
|
||||
#ifdef UT_DBG_USE_ABORT
|
||||
/** Abort the execution. */
|
||||
# define UT_DBG_PANIC abort()
|
||||
/** Stop threads (null operation) */
|
||||
# define UT_DBG_STOP do {} while (0)
|
||||
#else /* UT_DBG_USE_ABORT */
|
||||
/** Abort the execution. */
|
||||
# define UT_DBG_PANIC \
|
||||
if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL
|
||||
/** Stop threads in ut_a(). */
|
||||
# define UT_DBG_STOP do \
|
||||
if (UNIV_UNLIKELY(ut_dbg_stop_threads)) { \
|
||||
ut_dbg_stop_thread(__FILE__, (ulint) __LINE__); \
|
||||
} while (0)
|
||||
#endif /* UT_DBG_USE_ABORT */
|
||||
|
||||
/** Abort execution if EXPR does not evaluate to nonzero.
|
||||
@param EXPR assertion expression that should hold */
|
||||
|
@ -105,7 +66,6 @@ ut_dbg_stop_thread(
|
|||
__FILE__, (ulint) __LINE__); \
|
||||
UT_DBG_PANIC; \
|
||||
} \
|
||||
UT_DBG_STOP; \
|
||||
} while (0)
|
||||
|
||||
/** Abort execution. */
|
||||
|
|
|
@ -604,10 +604,6 @@ sync_array_deadlock_step(
|
|||
new = sync_array_find_thread(arr, thread);
|
||||
|
||||
if (UNIV_UNLIKELY(new == start)) {
|
||||
/* Stop running of other threads */
|
||||
|
||||
ut_dbg_stop_threads = TRUE;
|
||||
|
||||
/* Deadlock */
|
||||
fputs("########################################\n"
|
||||
"DEADLOCK of threads detected!\n", stderr);
|
||||
|
|
|
@ -35,16 +35,6 @@ Created 1/30/1994 Heikki Tuuri
|
|||
UNIV_INTERN ulint ut_dbg_zero = 0;
|
||||
#endif
|
||||
|
||||
#if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT)
|
||||
/** If this is set to TRUE by ut_dbg_assertion_failed(), all threads
|
||||
will stop at the next ut_a() or ut_ad(). */
|
||||
UNIV_INTERN ibool ut_dbg_stop_threads = FALSE;
|
||||
#endif
|
||||
#ifndef UT_DBG_USE_ABORT
|
||||
/** A null pointer that will be dereferenced to trigger a memory trap */
|
||||
UNIV_INTERN ulint* ut_dbg_null_ptr = NULL;
|
||||
#endif
|
||||
|
||||
/*************************************************************//**
|
||||
Report a failed assertion. */
|
||||
UNIV_INTERN
|
||||
|
@ -80,30 +70,8 @@ ut_dbg_assertion_failed(
|
|||
"InnoDB: corruption in the InnoDB tablespace. Please refer to\n"
|
||||
"InnoDB: " REFMAN "forcing-innodb-recovery.html\n"
|
||||
"InnoDB: about forcing recovery.\n", stderr);
|
||||
#if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT)
|
||||
ut_dbg_stop_threads = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT)
|
||||
/*************************************************************//**
|
||||
Stop a thread after assertion failure. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
ut_dbg_stop_thread(
|
||||
/*===============*/
|
||||
const char* file,
|
||||
ulint line)
|
||||
{
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
fprintf(stderr, "InnoDB: Thread %lu stopped in file %s line %lu\n",
|
||||
os_thread_pf(os_thread_get_curr_id()),
|
||||
innobase_basename(file), line);
|
||||
os_thread_sleep(1000000000);
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_COMPILE_TEST_FUNCS
|
||||
|
||||
#include <sys/types.h>
|
||||
|
|
Loading…
Reference in a new issue