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);