diff options
author | Böszörményi Zoltán <zboszor@pr.hu> | 2020-06-19 14:31:28 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-06-19 17:31:28 +0200 |
commit | 6aff9a50cae40582d2571e7aa6f336d5c6a99547 (patch) | |
tree | 4944ea98354c7cbdca96d6bbb8344fbfb3571756 | |
parent | 32f377b0b94482a5b126408942646b9bd101c042 (diff) | |
download | php-git-6aff9a50cae40582d2571e7aa6f336d5c6a99547.tar.gz |
Fixed bug #79570
Use the same logic for getgrgid_r, getpwnam_r and getpwuid_r
as for getgrnam_r in #75696
Closes GH-5740.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/posix/posix.c | 18 |
2 files changed, 20 insertions, 0 deletions
@@ -32,6 +32,8 @@ PHP NEWS - Standard: . Fixed bug #74267 (segfault with streams and invalid data). (cmb) + . Fixed bug #79579 (ZTS build of PHP 7.3.17 doesn't handle ERANGE for + posix_getgrgid and others). (Böszörményi Zoltán) 11 Jun 2020, PHP 7.3.19 diff --git a/ext/posix/posix.c b/ext/posix/posix.c index 5a2f352e41..2826eb0e84 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -1140,8 +1140,14 @@ PHP_FUNCTION(posix_getgrgid) grbuf = emalloc(grbuflen); +try_again: ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr); if (ret || retgrptr == NULL) { + if (errno == ERANGE) { + grbuflen *= 2; + grbuf = erealloc(grbuf, grbuflen); + goto try_again; + } POSIX_G(last_error) = ret; efree(grbuf); RETURN_FALSE; @@ -1209,7 +1215,13 @@ PHP_FUNCTION(posix_getpwnam) buf = emalloc(buflen); pw = &pwbuf; +try_again: if (getpwnam_r(name, pw, buf, buflen, &pw) || pw == NULL) { + if (errno == ERANGE) { + buflen *= 2; + buf = erealloc(buf, buflen); + goto try_again; + } efree(buf); POSIX_G(last_error) = errno; RETURN_FALSE; @@ -1258,8 +1270,14 @@ PHP_FUNCTION(posix_getpwuid) } pwbuf = emalloc(pwbuflen); +try_again: ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr); if (ret || retpwptr == NULL) { + if (errno == ERANGE) { + pwbuflen *= 2; + pwbuf = erealloc(pwbuf, pwbuflen); + goto try_again; + } POSIX_G(last_error) = ret; efree(pwbuf); RETURN_FALSE; |