summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2005-03-03 16:52:44 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:55:53 -0500
commit140752fd35bd5701b3078abf695f811d933fe893 (patch)
tree1b66bc1d681aff4a5d62bc0647c4dd8683545377
parent85b094801e3dcabc7aa86360371515c5c471027f (diff)
downloadsamba-140752fd35bd5701b3078abf695f811d933fe893.tar.gz
samba-140752fd35bd5701b3078abf695f811d933fe893.tar.bz2
samba-140752fd35bd5701b3078abf695f811d933fe893.zip
r5647: Caches are good for performance, but you get a consistency problem.
Fix bug # 2401. Volker (This used to be commit eb4ef94f244d28fe531d0b9f724a66ed3834b687)
-rw-r--r--source3/auth/auth_util.c1
-rw-r--r--source3/groupdb/mapping.c2
-rw-r--r--source3/lib/util_pw.c14
-rw-r--r--source3/rpc_server/srv_samr_nt.c2
4 files changed, 19 insertions, 0 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c
index f3c01a58ca..7cab3df99e 100644
--- a/source3/auth/auth_util.c
+++ b/source3/auth/auth_util.c
@@ -50,6 +50,7 @@ static int smb_create_user(const char *domain, const char *unix_username, const
if (homedir)
all_string_sub(add_script, "%H", homedir, sizeof(pstring));
ret = smbrun(add_script,NULL);
+ flush_pwnam_cache();
DEBUG(ret ? 0 : 3,("smb_create_user: Running the command `%s' gave %d\n",add_script,ret));
return ret;
}
diff --git a/source3/groupdb/mapping.c b/source3/groupdb/mapping.c
index 1c29cc77c4..5613240a12 100644
--- a/source3/groupdb/mapping.c
+++ b/source3/groupdb/mapping.c
@@ -1050,6 +1050,7 @@ int smb_set_primary_group(const char *unix_group, const char* unix_user)
all_string_sub(add_script, "%g", unix_group, sizeof(add_script));
all_string_sub(add_script, "%u", unix_user, sizeof(add_script));
ret = smbrun(add_script,NULL);
+ flush_pwnam_cache();
DEBUG(ret ? 0 : 3,("smb_set_primary_group: "
"Running the command `%s' gave %d\n",add_script,ret));
return ret;
@@ -1060,6 +1061,7 @@ int smb_set_primary_group(const char *unix_group, const char* unix_user)
if ( winbind_set_user_primary_group( unix_user, unix_group ) ) {
DEBUG(3,("smb_delete_group: winbindd set the group (%s) as the primary group for user (%s)\n",
unix_group, unix_user));
+ flush_pwnam_cache();
return 0;
}
diff --git a/source3/lib/util_pw.c b/source3/lib/util_pw.c
index 0d7ffe09e9..13349bad34 100644
--- a/source3/lib/util_pw.c
+++ b/source3/lib/util_pw.c
@@ -70,6 +70,20 @@ static void init_pwnam_cache(void)
return;
}
+void flush_pwnam_cache(void)
+{
+ int i;
+
+ init_pwnam_cache();
+
+ for (i=0; i<PWNAMCACHE_SIZE; i++) {
+ if (pwnam_cache[i] == NULL)
+ continue;
+
+ passwd_free(&pwnam_cache[i]);
+ }
+}
+
struct passwd *getpwnam_alloc(const char *name)
{
int i;
diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c
index 8a10fa6d2d..139960f661 100644
--- a/source3/rpc_server/srv_samr_nt.c
+++ b/source3/rpc_server/srv_samr_nt.c
@@ -2335,6 +2335,7 @@ NTSTATUS _samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CREA
/* implicit call to getpwnam() next. we have a valid SID coming out of this call */
+ flush_pwnam_cache();
nt_status = pdb_init_sam_new(&sam_pass, account, new_rid);
/* this code is order such that we have no unnecessary retuns
@@ -3805,6 +3806,7 @@ static int smb_delete_user(const char *unix_user)
return -1;
all_string_sub(del_script, "%u", unix_user, sizeof(del_script));
ret = smbrun(del_script,NULL);
+ flush_pwnam_cache();
DEBUG(ret ? 0 : 3,("smb_delete_user: Running the command `%s' gave %d\n",del_script,ret));
return ret;