diff options
author | Volker Lendecke <vl@samba.org> | 2010-02-06 13:26:06 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-02-13 17:23:43 +0100 |
commit | 2ea2d2a81e0666f478c5daf1469c8447a3096e8e (patch) | |
tree | c4e6fe158e37f817d9c74f05a04f2b26f655208c | |
parent | 271a4c60dbec0d001dc55df58de8e54274137853 (diff) | |
download | samba-2ea2d2a81e0666f478c5daf1469c8447a3096e8e.tar.gz samba-2ea2d2a81e0666f478c5daf1469c8447a3096e8e.tar.bz2 samba-2ea2d2a81e0666f478c5daf1469c8447a3096e8e.zip |
s3: Fix bug 5198 -- parse chfn(1)-change gecos field
-rw-r--r-- | source3/passdb/passdb.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index ecb609ad5c..0adefd5c6d 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -122,6 +122,18 @@ struct samu *samu_new( TALLOC_CTX *ctx ) return user; } +static int count_commas(const char *str) +{ + int num_commas = 0; + const char *comma = str; + + while ((comma = strchr(comma, ',')) != NULL) { + comma += 1; + num_commas += 1; + } + return num_commas; +} + /********************************************************************* Initialize a struct samu from a struct passwd including the user and group SIDs. The *user structure is filled out with the Unix @@ -132,6 +144,7 @@ static NTSTATUS samu_set_unix_internal(struct samu *user, const struct passwd *p { const char *guest_account = lp_guestaccount(); const char *domain = global_myname(); + char *fullname; uint32 urid; if ( !pwd ) { @@ -141,7 +154,27 @@ static NTSTATUS samu_set_unix_internal(struct samu *user, const struct passwd *p /* Basic properties based upon the Unix account information */ pdb_set_username(user, pwd->pw_name, PDB_SET); - pdb_set_fullname(user, pwd->pw_gecos, PDB_SET); + + fullname = NULL; + + if (count_commas(pwd->pw_gecos) == 3) { + /* + * Heuristic: This seems to be a gecos field that has been + * edited by chfn(1). Only use the part before the first + * comma. Fixes bug 5198. + */ + fullname = talloc_strndup( + talloc_tos(), pwd->pw_gecos, + strchr(pwd->pw_gecos, ',') - pwd->pw_gecos); + } + + if (fullname != NULL) { + pdb_set_fullname(user, fullname, PDB_SET); + } else { + pdb_set_fullname(user, pwd->pw_gecos, PDB_SET); + } + TALLOC_FREE(fullname); + pdb_set_domain (user, get_global_sam_name(), PDB_DEFAULT); #if 0 /* This can lead to a primary group of S-1-22-2-XX which |