|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-02-22 23:32 UTC] stas at FreeBSD dot org
Description: ------------ This module has problems with functions like getgrgid_r etc. It tries to find out limits using sysconf, but FreeBSD doesn't have, e.g. _SC_GETPW_R_SIZE_MAX. Since it does't try to check the return value it effectively leads to attempt to allocate (size_t)-1 bytes, which obviously fails, since trying to allocate (size_t)-1 bytes exceeds any limits. Reproduce code: --------------- $groupinfo = posix_getgrgid(0); print_r($groupinfo); Expected result: ---------------- something meaningful PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 07 14:00:02 2025 UTC |
The patch itself: ---------------------------------------------------------------- --- posix.c.orig Fri Jan 12 04:46:11 2007 +++ posix.c Thu Feb 22 14:56:56 2007 @@ -837,9 +837,8 @@ #if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX) buflen = sysconf(_SC_GETGR_R_SIZE_MAX); - if (buflen < 1) { - RETURN_FALSE; - } + if (buflen < 0) + buflen = 1024; buf = emalloc(buflen); g = &gbuf; @@ -887,6 +886,8 @@ #ifdef HAVE_GETGRGID_R grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX); + if (grbuflen < 0) + grbuflen = 1024; grbuf = emalloc(grbuflen); ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr); @@ -950,9 +951,9 @@ #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R) buflen = sysconf(_SC_GETPW_R_SIZE_MAX); - if (buflen < 1) { - RETURN_FALSE; - } + if (buflen < 0) + buflen = 1024; + buf = emalloc(buflen); pw = &pwbuf; @@ -999,9 +1000,8 @@ } #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R) pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); - if (pwbuflen < 1) { - RETURN_FALSE; - } + if (pwbuflen < 0) + pwbuflen = 1024; pwbuf = emalloc(pwbuflen); ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr); --------------------------------------------------------------+ if (grbuflen < 0) + grbuflen = 1024; I definitely agree with this part of the patch. But other parts look to me as a "workaround" for FreeBSD problems. - if (buflen < 1) { - RETURN_FALSE; - } + if (buflen < 0) + buflen = 1024; It might be safe to do it on FreeBSD when you know for sure that this functionality is missing and it's safe to use 1K buffer, but other systems might behave differently.- if (buflen < 1) { - RETURN_FALSE; - } + if (buflen < 0) + buflen = 1024; >It might be safe to do it on FreeBSD when you know for sure >that this functionality is missing and it's safe to use 1K >buffer, but other systems might behave differently. This patch covers two problems: 1) The POSIX says that sysconf will return -1 on failure, thus the ( < 1) check is definitely incorrect 2) It's safe to use the buffer of any size (according to POSIX), since you give the buffer length to these functions. They'll return error if the buffer lenght isn't enough - it's better then give up on retriving this info just in case the sysconf doesn't has these limit values.He is refering to this part of the patch: @@ -887,6 +886,8 @@ #ifdef HAVE_GETGRGID_R grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX); + if (grbuflen < 0) + grbuflen = 1024; so there is no check there for a negative return value.