Skip to content

Commit 556c3fd

Browse files
committed
Put the error message into firebird.log before BUGCHECK actions because there is always a risk of crashing
1 parent 62c900f commit 556c3fd

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

src/jrd/err.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ using namespace Firebird;
5353
//#define JRD_FAILURE_UNKNOWN "<UNKNOWN>" // Used when buffer fails
5454

5555

56-
static void internal_error(ISC_STATUS status, int number, const TEXT* file = NULL, int line = 0);
56+
static void get_internal_error_msg(TEXT* errmsg_buf, size_t errmsg_buf_size, int number, const TEXT* file = NULL, int line = 0);
5757
static void post_nothrow(const unsigned lenToAdd, const ISC_STATUS* toAdd, FbStatusVector* statusVector);
5858

5959

@@ -69,13 +69,10 @@ void ERR_bugcheck(int number, const TEXT* file, int line)
6969
* Things seem to be going poorly today.
7070
*
7171
**************************************/
72-
thread_db* const tdbb = JRD_get_thread_data();
73-
Database* const dbb = tdbb->getDatabase();
74-
75-
dbb->dbb_flags |= DBB_bugcheck;
76-
CCH_shutdown(tdbb);
72+
TEXT errmsg[MAX_ERRMSG_LEN + 1];
73+
get_internal_error_msg(errmsg, sizeof(errmsg), number, file, line);
7774

78-
internal_error(isc_bug_check, number, file, line);
75+
ERR_bugcheck_msg(errmsg);
7976
}
8077

8178

@@ -94,10 +91,23 @@ void ERR_bugcheck_msg(const TEXT* msg)
9491
thread_db* const tdbb = JRD_get_thread_data();
9592
Database* const dbb = tdbb->getDatabase();
9693

94+
Arg::StatusVector status_vector;
95+
status_vector << Arg::Gds(isc_bug_check) << Arg::Str(msg);
96+
FbLocalStatus status;
97+
status_vector.copyTo(&status);
98+
99+
// It's important to put the message into the log before any
100+
// further actions because there is always a risk of crashing.
101+
iscDbLogStatus(dbb->dbb_filename.nullStr(), &status);
102+
97103
dbb->dbb_flags |= DBB_bugcheck;
98104
CCH_shutdown(tdbb);
99105

100-
ERR_post(Arg::Gds(isc_bug_check) << Arg::Str(msg));
106+
if (Config::getBugcheckAbort())
107+
abort();
108+
109+
ERR_post_nothrow(status_vector);
110+
status_exception::raise(tdbb->tdbb_status_vector);
101111
}
102112

103113

@@ -117,7 +127,10 @@ void ERR_soft_bugcheck(int number, const TEXT* file, int line)
117127
**************************************/
118128

119129
fb_assert(false);
120-
internal_error(isc_bug_check, number, file, line);
130+
TEXT errmsg[MAX_ERRMSG_LEN + 1];
131+
get_internal_error_msg(errmsg, sizeof(errmsg), number, file, line);
132+
133+
ERR_post(Arg::Gds(isc_bug_check) << Arg::Str(errmsg));
121134
}
122135

123136

@@ -133,8 +146,10 @@ void ERR_corrupt(int number)
133146
* Things seem to be going poorly today.
134147
*
135148
**************************************/
149+
TEXT errmsg[MAX_ERRMSG_LEN + 1];
150+
get_internal_error_msg(errmsg, sizeof(errmsg), number);
136151

137-
internal_error(isc_db_corrupt, number);
152+
ERR_post(Arg::Gds(isc_db_corrupt) << Arg::Str(errmsg));
138153
}
139154

140155

@@ -413,7 +428,7 @@ void ERR_build_status(FbStatusVector* status_vector, const Arg::StatusVector& v)
413428
}
414429

415430

416-
static void internal_error(ISC_STATUS status, int number, const TEXT* file, int line)
431+
static void get_internal_error_msg(TEXT* errmsg_buf, size_t errmsg_buf_size, int number, const TEXT* file, int line)
417432
{
418433
/**************************************
419434
*
@@ -425,12 +440,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
425440
* Things seem to be going poorly today.
426441
*
427442
**************************************/
428-
TEXT errmsg[MAX_ERRMSG_LEN + 1];
443+
if (gds__msg_lookup(0, FB_IMPL_MSG_FACILITY_JRD_BUGCHK, number, errmsg_buf_size, errmsg_buf, NULL) < 1)
444+
strcpy(errmsg_buf, "Internal error code");
429445

430-
if (gds__msg_lookup(0, FB_IMPL_MSG_FACILITY_JRD_BUGCHK, number, sizeof(errmsg), errmsg, NULL) < 1)
431-
strcpy(errmsg, "Internal error code");
432-
433-
const size_t len = strlen(errmsg);
446+
const size_t len = strlen(errmsg_buf);
434447

435448
if (file)
436449
{
@@ -444,12 +457,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
444457
break;
445458
}
446459
}
447-
fb_utils::snprintf(errmsg + len, sizeof(errmsg) - len,
460+
fb_utils::snprintf(errmsg_buf + len, errmsg_buf_size - len,
448461
" (%d), file: %s line: %d", number, ptr, line);
449462
}
450463
else {
451-
fb_utils::snprintf(errmsg + len, sizeof(errmsg) - len, " (%d)", number);
464+
fb_utils::snprintf(errmsg_buf + len, errmsg_buf_size - len, " (%d)", number);
452465
}
453-
454-
ERR_post(Arg::Gds(status) << Arg::Str(errmsg));
455466
}

0 commit comments

Comments
 (0)