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 +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 +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 - 1:3.6.1-77 +- Fix winbind cache upgrade. +- resolves: #760137 + * Fri Nov 18 2011 Andreas Schneider - 1:3.6.1-76 - Fix piddir to match with systemd files. - Fix crash bug in the debug system.