summaryrefslogtreecommitdiff
path: root/bdb/patches/log-corruption.patch
diff options
context:
space:
mode:
Diffstat (limited to 'bdb/patches/log-corruption.patch')
-rw-r--r--bdb/patches/log-corruption.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/bdb/patches/log-corruption.patch b/bdb/patches/log-corruption.patch
new file mode 100644
index 00000000000..16c37ff7c06
--- /dev/null
+++ b/bdb/patches/log-corruption.patch
@@ -0,0 +1,62 @@
+# This patch fixes a bug caused mysqld to get a core dump while
+# bdb tries to resolve the log file after mysqld was killed with kill -9.
+#
+# Author: Michael Ubell, Sleepycat Software
+# Mon, 26 Feb 2001 12:56:23 -0500 (EST)
+#
+
+*** log/log_rec.c 2001/02/08 03:05:01 11.50
+--- log/log_rec.c 2001/02/24 00:42:46 11.51
+***************
+*** 50,55 ****
+--- 50,56 ----
+ #include "db_am.h"
+ #include "log.h"
+
++ static int __log_check_master __P((DB_ENV *, u_int8_t *, char *));
+ static int __log_do_open __P((DB_ENV *, DB_LOG *,
+ u_int8_t *, char *, DBTYPE, int32_t, db_pgno_t));
+ static int __log_open_file __P((DB_ENV *, DB_LOG *, __log_register_args *));
+***************
+*** 341,346 ****
+--- 342,350 ----
+ * Verify that we are opening the same file that we were
+ * referring to when we wrote this log record.
+ */
++ if (meta_pgno != PGNO_BASE_MD &&
++ __log_check_master(dbenv, uid, name) != 0)
++ goto not_right;
+ if (memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0) {
+ memset(zeroid, 0, DB_FILE_ID_LEN);
+ if (memcmp(dbp->fileid, zeroid, DB_FILE_ID_LEN) != 0)
+***************
+*** 359,364 ****
+--- 363,390 ----
+ (void)__log_add_logid(dbenv, lp, NULL, ndx);
+
+ return (ENOENT);
++ }
++
++ static int
++ __log_check_master(dbenv, uid, name)
++ DB_ENV *dbenv;
++ u_int8_t *uid;
++ char *name;
++ {
++ DB *dbp;
++ int ret;
++
++ ret = 0;
++ if ((ret = db_create(&dbp, dbenv, 0)) != 0)
++ return (ret);
++ dbp->type = DB_BTREE;
++ ret = __db_dbopen(dbp, name, 0, __db_omode("rw----"), PGNO_BASE_MD);
++
++ if (ret == 0 && memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0)
++ ret = EINVAL;
++
++ (void) dbp->close(dbp, 0);
++ return (ret);
+ }
+
+ /*