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
@ -55,47 +55,8 @@ ut_dbg_assertion_failed(
|
|||||||
ulint line) /*!< in: line number of the assertion */
|
ulint line) /*!< in: line number of the assertion */
|
||||||
UNIV_COLD __attribute__((nonnull(2)));
|
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. */
|
/** Abort the execution. */
|
||||||
# define UT_DBG_PANIC abort()
|
# 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.
|
/** Abort execution if EXPR does not evaluate to nonzero.
|
||||||
@param EXPR assertion expression that should hold */
|
@param EXPR assertion expression that should hold */
|
||||||
@ -105,7 +66,6 @@ ut_dbg_stop_thread(
|
|||||||
__FILE__, (ulint) __LINE__); \
|
__FILE__, (ulint) __LINE__); \
|
||||||
UT_DBG_PANIC; \
|
UT_DBG_PANIC; \
|
||||||
} \
|
} \
|
||||||
UT_DBG_STOP; \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/** Abort execution. */
|
/** Abort execution. */
|
||||||
|
@ -604,10 +604,6 @@ sync_array_deadlock_step(
|
|||||||
new = sync_array_find_thread(arr, thread);
|
new = sync_array_find_thread(arr, thread);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(new == start)) {
|
if (UNIV_UNLIKELY(new == start)) {
|
||||||
/* Stop running of other threads */
|
|
||||||
|
|
||||||
ut_dbg_stop_threads = TRUE;
|
|
||||||
|
|
||||||
/* Deadlock */
|
/* Deadlock */
|
||||||
fputs("########################################\n"
|
fputs("########################################\n"
|
||||||
"DEADLOCK of threads detected!\n", stderr);
|
"DEADLOCK of threads detected!\n", stderr);
|
||||||
|
@ -35,16 +35,6 @@ Created 1/30/1994 Heikki Tuuri
|
|||||||
UNIV_INTERN ulint ut_dbg_zero = 0;
|
UNIV_INTERN ulint ut_dbg_zero = 0;
|
||||||
#endif
|
#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. */
|
Report a failed assertion. */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
@ -80,30 +70,8 @@ ut_dbg_assertion_failed(
|
|||||||
"InnoDB: corruption in the InnoDB tablespace. Please refer to\n"
|
"InnoDB: corruption in the InnoDB tablespace. Please refer to\n"
|
||||||
"InnoDB: " REFMAN "forcing-innodb-recovery.html\n"
|
"InnoDB: " REFMAN "forcing-innodb-recovery.html\n"
|
||||||
"InnoDB: about forcing recovery.\n", stderr);
|
"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
|
#ifdef UNIV_COMPILE_TEST_FUNCS
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user