diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/substitute.c | 1 | ||||
-rw-r--r-- | source3/lib/username.c | 34 | ||||
-rw-r--r-- | source3/lib/util_pw.c | 134 |
3 files changed, 140 insertions, 29 deletions
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index 5a2bc1d890..c02ec9556a 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -92,7 +92,6 @@ static size_t expand_env_var(char *p, int len) static char *automount_path(const char *user_name) { static pstring server_path; - struct passwd *pass; /* use the passwd entry as the default */ /* this will be the default if WITH_AUTOMOUNT is not used or fails */ diff --git a/source3/lib/username.c b/source3/lib/username.c index 81408f4569..9541ebeb08 100644 --- a/source3/lib/username.c +++ b/source3/lib/username.c @@ -205,29 +205,7 @@ BOOL map_username(char *user) } /**************************************************************************** - Get_Pwnam wrapper -****************************************************************************/ - -static struct passwd *_Get_Pwnam(const char *s) -{ - struct passwd *ret; - - ret = sys_getpwnam(s); - if (ret) { -#ifdef HAVE_GETPWANAM - struct passwd_adjunct *pwret; - pwret = getpwanam(s); - if (pwret && pwret->pwa_passwd) - pstrcpy(ret->pw_passwd,pwret->pwa_passwd); -#endif - } - - return(ret); -} - - -/**************************************************************************** - * A wrapper for getpwnam(). The following variations are tried: + * A wrapper for sys_getpwnam(). The following variations are tried: * - as transmitted * - in all lower case if this differs from transmitted * - in all upper case if this differs from transmitted @@ -248,23 +226,23 @@ struct passwd *Get_Pwnam_internals(const char *user, char *user2) common case on UNIX systems */ strlower(user2); DEBUG(5,("Trying _Get_Pwnam(), username as lowercase is %s\n",user2)); - ret = _Get_Pwnam(user2); + ret = sys_getpwnam(user2); if(ret) goto done; /* Try as given, if username wasn't originally lowercase */ if(strcmp(user,user2) != 0) { DEBUG(5,("Trying _Get_Pwnam(), username as given is %s\n",user)); - ret = _Get_Pwnam(user); + ret = sys_getpwnam(user); if(ret) goto done; - } + } /* Try as uppercase, if username wasn't originally uppercase */ strupper(user2); if(strcmp(user,user2) != 0) { DEBUG(5,("Trying _Get_Pwnam(), username as uppercase is %s\n",user2)); - ret = _Get_Pwnam(user2); + ret = sys_getpwnam(user2); if(ret) goto done; } @@ -272,7 +250,7 @@ struct passwd *Get_Pwnam_internals(const char *user, char *user2) /* Try all combinations up to usernamelevel */ strlower(user2); DEBUG(5,("Checking combinations of %d uppercase letters in %s\n",lp_usernamelevel(),user2)); - ret = uname_string_combinations(user2, _Get_Pwnam, lp_usernamelevel()); + ret = uname_string_combinations(user2, sys_getpwnam, lp_usernamelevel()); done: DEBUG(5,("Get_Pwnam %s find a valid username!\n",ret ? "did":"didn't")); diff --git a/source3/lib/util_pw.c b/source3/lib/util_pw.c new file mode 100644 index 0000000000..3367a6cdc0 --- /dev/null +++ b/source3/lib/util_pw.c @@ -0,0 +1,134 @@ +/* + Unix SMB/Netbios implementation. + Version 3.0. + + Safe versions of getpw* calls + + Copyright (C) Andrew Bartlett 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +struct passwd *make_modifyable_passwd(const struct passwd *from) +{ + struct passwd *ret = smb_xmalloc(sizeof(*ret)); +/* This is the assumed shape of the members by certain parts of the code... + fstring pw_name; + fstring pw_passwd; + fstring pw_gecos; + pstring pw_dir; + pstring pw_shell; +*/ + char *pw_name = smb_xmalloc(sizeof(fstring)); + char *pw_passwd = smb_xmalloc(sizeof(fstring)); + char *pw_gecos = smb_xmalloc(sizeof(fstring)); + char *pw_dir = smb_xmalloc(sizeof(pstring)); + char *pw_shell = smb_xmalloc(sizeof(pstring)); + + ZERO_STRUCTP(ret); + + /* + * Now point the struct's members as the + * newly allocated buffers: + */ + + ret->pw_name = pw_name; + fstrcpy(ret->pw_name, from->pw_name); + + ret->pw_passwd = pw_passwd; + fstrcpy(ret->pw_passwd, from->pw_passwd); + + ret->pw_uid = from->pw_uid; + ret->pw_gid = from->pw_gid; + + ret->pw_gecos = pw_gecos; + fstrcpy(ret->pw_gecos, from->pw_gecos); + + ret->pw_dir = pw_dir; + pstrcpy(ret->pw_dir, from->pw_dir); + + ret->pw_shell = pw_shell; + pstrcpy(ret->pw_shell, from->pw_shell); + + return ret; +} + +static struct passwd *alloc_copy_passwd(const struct passwd *from) +{ + struct passwd *ret = smb_xmalloc(sizeof(*ret)); + ZERO_STRUCTP(ret); + ret->pw_name = smb_xstrdup(from->pw_name); + ret->pw_passwd = smb_xstrdup(from->pw_passwd); + ret->pw_uid = from->pw_uid; + ret->pw_gid = from->pw_gid; + ret->pw_gecos = smb_xstrdup(from->pw_gecos); + ret->pw_dir = smb_xstrdup(from->pw_dir); + ret->pw_shell = smb_xstrdup(from->pw_shell); + return ret; +} + +void passwd_free (struct passwd **buf) +{ + if (!*buf) { + DEBUG(0, ("attempted double-free of allocated passwd\n")); + return; + } + + SAFE_FREE((*buf)->pw_name); + SAFE_FREE((*buf)->pw_passwd); + SAFE_FREE((*buf)->pw_gecos); + SAFE_FREE((*buf)->pw_dir); + SAFE_FREE((*buf)->pw_shell); + + SAFE_FREE(*buf); +} + +struct passwd *getpwnam_alloc(const char *name) +{ + struct passwd *temp; + + temp = getpwnam(name); + + if (!temp) { +#if 0 + if (errno == ENOMEM) { + /* what now? */ + } +#endif + return NULL; + } + + return alloc_copy_passwd(temp); +} + +struct passwd *getpwuid_alloc(uid_t uid) +{ + struct passwd *temp; + + temp = getpwuid(uid); + + if (!temp) { +#if 0 + if (errno == ENOMEM) { + /* what now? */ + } +#endif + return NULL; + } + + return alloc_copy_passwd(temp); +} |