All pastes #259657 Raw Edit

Miscellany

public text v1 · immutable
#259657 ·published 2006-11-27 16:59 UTC
rendered paste body
--- filestat.old	2006-11-27 15:44:12.154290752 +0000
+++ filestat.c	2006-11-27 22:52:36.569625656 +0000
@@ -356,21 +356,29 @@
 {
 	zval **filename, **group;
 	gid_t gid;
-	struct group *gr=NULL;
+	struct group gr;
+	struct group *retgrptr;
+	char *grbuf;
+	int grbuflen;
 	int ret;
-
+    
 	if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &filename, &group)==FAILURE) {
 		WRONG_PARAM_COUNT;
 	}
 	convert_to_string_ex(filename);
 	if (Z_TYPE_PP(group) == IS_STRING) {
-		gr = getgrnam(Z_STRVAL_PP(group));
-		if (!gr) {
+		grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+		grbuf = emalloc(grbuflen);
+		ret = getgrnam_r(Z_STRVAL_PP(group), &gr, grbuf, grbuflen, &retgrptr);
+		/* If an error or entry not found */
+		if (ret != 0 || retgrptr == NULL ) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find gid for %s",
 					   Z_STRVAL_PP(group));
+			efree(grbuf); 
 			RETURN_FALSE;
 		}
-		gid = gr->gr_gid;
+		gid = gr.gr_gid;
+		efree(grbuf);
 	} else {
 		convert_to_long_ex(group);
 		gid = Z_LVAL_PP(group);
@@ -434,20 +442,29 @@
 	zval **filename, **user;
 	int ret;
 	uid_t uid;
-	struct passwd *pw = NULL;
-
+	struct passwd pw;
+	struct passwd *retpwptr;
+	char *pwbuf;
+	int pwbuflen;
+    
 	if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &filename, &user)==FAILURE) {
 		WRONG_PARAM_COUNT;
 	}
 	convert_to_string_ex(filename);
 	if (Z_TYPE_PP(user) == IS_STRING) {
-		pw = getpwnam(Z_STRVAL_PP(user));
-		if (!pw) {
+
+		pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
+		pwbuf = emalloc(pwbuflen);
+		ret = getpwnam_r(Z_STRVAL_PP(user), &pw, pwbuf, pwbuflen, &retpwptr);
+		/* If an error or entry not found */
+		if (ret != 0 || retpwptr == NULL) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find uid for %s",
 					   Z_STRVAL_PP(user));
+			efree(pwbuf); 
 			RETURN_FALSE;
 		}
-		uid = pw->pw_uid;
+		uid = pw.pw_uid;
+		efree(pwbuf); 
 	} else {
 		convert_to_long_ex(user);
 		uid = Z_LVAL_PP(user);