[samba] Fix winbind cache upgrade.
asn
asn at fedoraproject.org
Mon Dec 5 14:56:48 UTC 2011
commit eac283e63494e0a7e2a7b6016f26a119a9f81772
Author: Andreas Schneider <asn at redhat.com>
Date: Mon Dec 5 15:39:35 2011 +0100
Fix winbind cache upgrade.
samba-3.6.1-winbind_upgrade_cache.patch | 148 +++++++++++++++++++++++++++++++
samba.spec | 8 ++-
2 files changed, 155 insertions(+), 1 deletions(-)
---
diff --git a/samba-3.6.1-winbind_upgrade_cache.patch b/samba-3.6.1-winbind_upgrade_cache.patch
new file mode 100644
index 0000000..eff8dcb
--- /dev/null
+++ b/samba-3.6.1-winbind_upgrade_cache.patch
@@ -0,0 +1,148 @@
+From a3f600521122d1a6d74d16668bd1ea4447c5c867 Mon Sep 17 00:00:00 2001
+From: Andreas Schneider <asn at samba.org>
+Date: Fri, 2 Dec 2011 16:19:34 -0800
+Subject: [PATCH] s3-winbind: Add an update function for winbind cache.
+
+With 57b3d32 we changed the format for the winbind cache database and
+the code deleted the database for the upgrade. As this database holds
+also cached credentials, removing it is not an option. We need to update
+from version 1 to version 2.
+
+Autobuild-User: Jeremy Allison <jra at samba.org>
+Autobuild-Date: Sat Dec 3 03:47:58 CET 2011 on sn-devel-104
+---
+ source3/winbindd/winbindd_cache.c | 96 ++++++++++++++++++++++++++++++++++++-
+ 1 files changed, 94 insertions(+), 2 deletions(-)
+
+Index: samba-3.6.1/source3/winbindd/winbindd_cache.c
+===================================================================
+--- samba-3.6.1.orig/source3/winbindd/winbindd_cache.c
++++ samba-3.6.1/source3/winbindd/winbindd_cache.c
+@@ -38,7 +38,10 @@
+ #undef DBGC_CLASS
+ #define DBGC_CLASS DBGC_WINBIND
+
+-#define WINBINDD_CACHE_VERSION 2
++#define WINBINDD_CACHE_VER1 1 /* initial db version */
++#define WINBINDD_CACHE_VER2 2 /* second version with timeouts for NDR entries */
++
++#define WINBINDD_CACHE_VERSION WINBINDD_CACHE_VER2
+ #define WINBINDD_CACHE_VERSION_KEYSTR "WINBINDD_CACHE_VERSION"
+
+ extern struct winbindd_methods reconnect_methods;
+@@ -4081,6 +4084,70 @@ static void validate_panic(const char *c
+ exit(47);
+ }
+
++static int wbcache_update_centry_fn(TDB_CONTEXT *tdb,
++ TDB_DATA key,
++ TDB_DATA data,
++ void *state)
++{
++ uint64_t ctimeout;
++ TDB_DATA blob;
++
++ if (is_non_centry_key(key)) {
++ return 0;
++ }
++
++ if (data.dptr == NULL || data.dsize == 0) {
++ if (tdb_delete(tdb, key) < 0) {
++ DEBUG(0, ("tdb_delete for [%s] failed!\n",
++ key.dptr));
++ return 1;
++ }
++ }
++
++ /* add timeout to blob (uint64_t) */
++ blob.dsize = data.dsize + 8;
++
++ blob.dptr = SMB_XMALLOC_ARRAY(uint8_t, blob.dsize);
++ if (blob.dptr == NULL) {
++ return 1;
++ }
++ memset(blob.dptr, 0, blob.dsize);
++
++ /* copy status and seqnum */
++ memcpy(blob.dptr, data.dptr, 8);
++
++ /* add timeout */
++ ctimeout = lp_winbind_cache_time() + time(NULL);
++ SBVAL(blob.dptr, 8, ctimeout);
++
++ /* copy the rest */
++ memcpy(blob.dptr + 16, data.dptr + 8, data.dsize - 8);
++
++ if (tdb_store(tdb, key, blob, TDB_REPLACE) < 0) {
++ DEBUG(0, ("tdb_store to update [%s] failed!\n",
++ key.dptr));
++ SAFE_FREE(blob.dptr);
++ return 1;
++ }
++
++ SAFE_FREE(blob.dptr);
++ return 0;
++}
++
++static bool wbcache_upgrade_v1_to_v2(TDB_CONTEXT *tdb)
++{
++ int rc;
++
++ DEBUG(1, ("Upgrade to version 2 of the winbindd_cache.tdb\n"));
++
++ rc = tdb_traverse(tdb, wbcache_update_centry_fn, NULL);
++ if (rc < 0) {
++ return false;
++ }
++
++ return true;
++}
++
+ /***********************************************************************
+ Try and validate every entry in the winbindd cache. If we fail here,
+ delete the cache tdb and return non-zero.
+@@ -4091,11 +4158,12 @@ int winbindd_validate_cache(void)
+ int ret = -1;
+ const char *tdb_path = cache_path("winbindd_cache.tdb");
+ TDB_CONTEXT *tdb = NULL;
++ uint32_t vers_id;
++ bool ok;
+
+ DEBUG(10, ("winbindd_validate_cache: replacing panic function\n"));
+ smb_panic_fn = validate_panic;
+
+-
+ tdb = tdb_open_log(tdb_path,
+ WINBINDD_CACHE_TDB_DEFAULT_HASH_SIZE,
+ TDB_INCOMPATIBLE_HASH |
+@@ -4109,6 +4177,30 @@ int winbindd_validate_cache(void)
+ "error opening/initializing tdb\n"));
+ goto done;
+ }
++
++ /* Version check and upgrade code. */
++ if (!tdb_fetch_uint32(tdb, WINBINDD_CACHE_VERSION_KEYSTR, &vers_id)) {
++ DEBUG(10, ("Fresh database\n"));
++ tdb_store_uint32(tdb, WINBINDD_CACHE_VERSION_KEYSTR, WINBINDD_CACHE_VERSION);
++ vers_id = WINBINDD_CACHE_VERSION;
++ }
++
++ if (vers_id != WINBINDD_CACHE_VERSION) {
++ if (vers_id == WINBINDD_CACHE_VER1) {
++ ok = wbcache_upgrade_v1_to_v2(tdb);
++ if (!ok) {
++ DEBUG(10, ("winbindd_validate_cache: upgrade to version 2 failed.\n"));
++ unlink(tdb_path);
++ goto done;
++ }
++
++ tdb_store_uint32(tdb,
++ WINBINDD_CACHE_VERSION_KEYSTR,
++ WINBINDD_CACHE_VERSION);
++ vers_id = WINBINDD_CACHE_VER2;
++ }
++ }
++
+ tdb_close(tdb);
+
+ ret = tdb_validate_and_backup(tdb_path, cache_traverse_validate_fn);
diff --git a/samba.spec b/samba.spec
index cb74ab7..32b5189 100644
--- a/samba.spec
+++ b/samba.spec
@@ -1,4 +1,4 @@
-%define main_release 76
+%define main_release 77
%define samba_version 3.6.1
%define tdb_version 1.2.9
%define talloc_version 2.0.5
@@ -46,6 +46,7 @@ Patch104: samba-3.0.0rc3-nmbd-netbiosname.patch
Patch107: samba-3.2.0pre1-grouppwd.patch
Patch200: samba-3.2.5-inotify.patch
Patch300: samba-3.6.1-debug.patch
+Patch301: samba-3.6.1-winbind_upgrade_cache.patch
Requires(pre): samba-common = %{epoch}:%{samba_version}-%{release}
Requires: pam >= 0:0.64
@@ -212,6 +213,7 @@ cp %{SOURCE11} packaging/Fedora/
%patch107 -p1 -b .grouppwd
%patch200 -p0 -b .inotify
%patch300 -p1 -b .debug
+%patch301 -p1 -b .winbind
mv %samba_source/VERSION %samba_source/VERSION.orig
sed -e 's/SAMBA_VERSION_VENDOR_SUFFIX=$/&\"%{samba_release}\"/' < %samba_source/VERSION.orig > %samba_source/VERSION
@@ -669,6 +671,10 @@ fi
%{_datadir}/pixmaps/samba/logo-small.png
%changelog
+* Mon Dec 05 2011 Andreas Schneider <asn at redhat.com> - 1:3.6.1-77
+- Fix winbind cache upgrade.
+- resolves: #760137
+
* Fri Nov 18 2011 Andreas Schneider <asn at redhat.com> - 1:3.6.1-76
- Fix piddir to match with systemd files.
- Fix crash bug in the debug system.
More information about the scm-commits
mailing list