[Fedora-directory-commits] ldapserver/ldap/servers/slapd protect_db.c, 1.10, 1.11 main.c, 1.19, 1.20 log.c, 1.15, 1.16 libglobs.c, 1.18, 1.19 slap.h, 1.24, 1.25

Noriko Hosoi (nhosoi) fedora-directory-commits at redhat.com
Fri Aug 17 02:12:39 UTC 2007


Author: nhosoi

Update of /cvs/dirsec/ldapserver/ldap/servers/slapd
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv9738

Modified Files:
	protect_db.c main.c log.c libglobs.c slap.h 
Log Message:
Resolves: #253069
Summary: cyclic dependency from getpwnam() in log rotation code
Description: Moved getpwnam call to the startup time, store the info in 
slapdFrontendConfig to reuse.



Index: protect_db.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/protect_db.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- protect_db.c	16 Aug 2007 19:28:57 -0000	1.10
+++ protect_db.c	17 Aug 2007 02:12:37 -0000	1.11
@@ -201,17 +201,16 @@
     }
 
     /* Make sure it's owned by the correct user */
-    if (slapdFrontendConfig->localuser != NULL) {
-      if ( (pw = getpwnam(slapdFrontendConfig->localuser)) == NULL ) {
-        LDAPDebug(LDAP_DEBUG_ANY, GETPWNAM_WARNING, slapdFrontendConfig->localuser, errno, strerror(errno));
-      } else {
+    if (slapdFrontendConfig->localuser != NULL &&
+        slapdFrontendConfig->localuserinfo != NULL) {
+        pw = slapdFrontendConfig->localuserinfo;
         if (chown(dir, pw->pw_uid, -1) == -1) {
             stat(dir, &stat_buffer);
             if (stat_buffer.st_uid != pw->pw_uid) {
                 LDAPDebug(LDAP_DEBUG_ANY, CHOWN_WARNING, dir, 0, 0);
+                return 1;
             }
         }
-      } /* else */
     }
 
     return 0;
@@ -233,24 +232,23 @@
     file_name[sizeof(file_name)-1] = (char)0;
     
     if ((prfd = PR_Open(file_name, PR_RDWR | PR_CREATE_FILE, 0666)) == NULL) {
-    LDAPDebug(LDAP_DEBUG_ANY, FILE_CREATE_WARNING, file_name, 0, 0);
-    return;
+        LDAPDebug(LDAP_DEBUG_ANY, FILE_CREATE_WARNING, file_name, 0, 0);
+        return;
     }
     
     /* Make sure the owner is of the file is the user the server
      * runs as. */
-    if (slapdFrontendConfig->localuser != NULL) {
-      if ( (pw = getpwnam(slapdFrontendConfig->localuser)) == NULL ) {
-    LDAPDebug(LDAP_DEBUG_ANY, GETPWNAM_WARNING, slapdFrontendConfig->localuser, errno, strerror(errno));
-      } else {
+    if (slapdFrontendConfig->localuser != NULL &&
+        slapdFrontendConfig->localuserinfo != NULL) {
+        pw = slapdFrontendConfig->localuserinfo;
         if (chown(file_name, pw->pw_uid, -1) == -1) {
             stat(file_name, &stat_buffer);
             if (stat_buffer.st_uid != pw->pw_uid) {
                 LDAPDebug(LDAP_DEBUG_ANY, CHOWN_WARNING, file_name, 0, 0);
             }
         }
-      } /* else */
     }
+bail:
     PR_Close(prfd);
 }
 


Index: main.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/main.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- main.c	3 Aug 2007 22:14:41 -0000	1.19
+++ main.c	17 Aug 2007 02:12:37 -0000	1.20
@@ -247,8 +247,8 @@
     /* change the owner for each of the files in the dir */
     while( (entry = PR_ReadDir(dir , PR_SKIP_BOTH )) !=NULL ) 
     {
-	PR_snprintf(file,MAXPATHLEN+1,"%s/%s",log,entry->name);
-	slapd_chown_if_not_owner( file, pw->pw_uid, -1 ); 
+      PR_snprintf(file,MAXPATHLEN+1,"%s/%s",log,entry->name);
+      slapd_chown_if_not_owner( file, pw->pw_uid, -1 ); 
     }
     PR_CloseDir( dir );
   }
@@ -267,14 +267,23 @@
 
 	slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
 
-
-	if ( slapdFrontendConfig->localuser != NULL )  {
-	        if ( (pw = getpwnam( slapdFrontendConfig->localuser )) == NULL ) 
-		      return;
-	}
-	else {
-		return;
+	if (slapdFrontendConfig->localuser != NULL) {
+		if (slapdFrontendConfig->localuserinfo == NULL) {
+			pw = getpwnam( slapdFrontendConfig->localuser );
+			if ( NULL == pw ) {
+				LDAPDebug(LDAP_DEBUG_ANY, 
+					"Unable to find user %s in system account database, "
+					"errno %d (%s)\n",
+					slapdFrontendConfig->localuser, errno, strerror(errno));
+				return; 
+			}
+			slapdFrontendConfig->localuserinfo =
+					(struct passwd *)slapi_ch_malloc(sizeof(struct passwd));
+			memcpy(slapdFrontendConfig->localuserinfo, pw, sizeof(struct passwd));
+		}
+		pw = slapdFrontendConfig->localuserinfo;
 	}
+
 	/* config directory needs to be owned by the local user */
 	if (slapdFrontendConfig->configdir) {
 		chown_dir_files(slapdFrontendConfig->configdir, pw, PR_FALSE);


Index: log.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/log.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- log.c	10 Nov 2006 23:45:40 -0000	1.15
+++ log.c	17 Aug 2007 02:12:37 -0000	1.16
@@ -3480,9 +3480,9 @@
 	slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
 
 #ifndef _WIN32
-	if ( slapdFrontendConfig->localuser != NULL )  {
-		if ( (pw = getpwnam( slapdFrontendConfig->localuser )) == NULL )
-			return LOG_UNABLE_TO_OPENFILE;
+	if ( slapdFrontendConfig->localuser != NULL &&
+	     slapdFrontendConfig->localuserinfo != NULL ) {
+		pw = slapdFrontendConfig->localuserinfo;
 	}
 	else {
 		return LOG_UNABLE_TO_OPENFILE;


Index: libglobs.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/libglobs.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- libglobs.c	11 Jul 2007 01:14:05 -0000	1.18
+++ libglobs.c	17 Aug 2007 02:12:37 -0000	1.19
@@ -2500,9 +2500,20 @@
   }
 
   if (apply) {
+    struct passwd *pw = NULL;
 	CFG_LOCK_WRITE(slapdFrontendConfig);
 	slapi_ch_free ( (void **) &slapdFrontendConfig->localuser );
 	slapdFrontendConfig->localuser = slapi_ch_strdup ( value );
+	if (slapdFrontendConfig->localuserinfo != NULL) {
+	  slapi_ch_free ( (void **) &(slapdFrontendConfig->localuserinfo) );
+	}
+	pw = getpwnam( value );
+	if ( pw ) {
+	  slapdFrontendConfig->localuserinfo =
+			  (struct passwd *)slapi_ch_malloc(sizeof(struct passwd));
+	  memcpy(slapdFrontendConfig->localuserinfo, pw, sizeof(struct passwd));
+	}
+
 	CFG_UNLOCK_WRITE(slapdFrontendConfig);
   }
   return retVal;


Index: slap.h
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/slap.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- slap.h	3 Aug 2007 22:14:41 -0000	1.24
+++ slap.h	17 Aug 2007 02:12:37 -0000	1.25
@@ -1925,6 +1925,9 @@
   char *ldapi_gidnumber_type;   /* type that contains gid number */
   char *ldapi_search_base_dn;   /* base dn to search for mapped entries */
   char *ldapi_auto_dn_suffix;   /* suffix to be appended to auto gen DNs */
+#ifndef _WIN32
+  struct passwd *localuserinfo; /* userinfo of localuser */
+#endif /* _WIN32 */
 } slapdFrontendConfig_t;
 
 #define SLAPD_FULL	0




More information about the Fedora-directory-commits mailing list