s3: Fix bug 5198 -- parse chfn(1)-change gecos field
authorVolker Lendecke <vl@samba.org>
Sat, 6 Feb 2010 12:26:06 +0000 (13:26 +0100)
committerKarolin Seeger <kseeger@samba.org>
Mon, 29 Mar 2010 07:40:58 +0000 (09:40 +0200)
(cherry picked from commit 2ea2d2a81e0666f478c5daf1469c8447a3096e8e)
(cherry picked from commit 52a3ebc3a4ec54a427e54fa331251fd495c3c6aa)

source3/passdb/passdb.c

index 0255edcd17a4995fa98514a335b24e0fab22ea93..f174e3b1a6af1b8c027ae2ae744b0d044704f9d4 100644 (file)
@@ -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