PHP 4.0 Bug #6747: read() leaks memory
| From: | vincent dot negrier at mixad dot com | Date: | Thu, 14 Sep 2000 03:55:04 +0000 |
| Subject: | PHP 4.0 Bug #6747: read() leaks memory | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-33250@lists.php.net to get a copy of this message | ||
From: vincent.negrier@mixad.com
Operating system: Linux 2.2
PHP version: 4.0.2
PHP Bug Type: Sockets related
Bug description: read() leaks memory
My problem was the following :
Each call to read($socket, &$buffer, $length) on a non-blocking INET socket leaked $length bytes
of memory.
I made a quick fix, it no longer leaks memory but I'm not sure i've done it the right way.
source code from the read() function in ext/sockets/sockets.c :
original:
tmpbuf = emalloc(Z_LVAL_PP(length)*sizeof(char));
if (tmpbuf == NULL) {
php_error(E_WARNING, "Couldn't allocate memory from %s()", get_active_fu
RETURN_FALSE;
}
ret = read(Z_LVAL_PP(fd), tmpbuf, Z_LVAL_PP(length));
if (ret >= 0) {
Z_STRVAL_PP(buf) = tmpbuf;
Z_STRLEN_PP(buf) = ret;
RETURN_LONG(ret);
} else {
RETURN_LONG(-errno);
}
Modified:
tmpbuf = emalloc(Z_LVAL_PP(length)*sizeof(char));
if (tmpbuf == NULL) {
php_error(E_WARNING, "Couldn't allocate memory from %s()", get_active_fu
RETURN_FALSE;
}
ret = read(Z_LVAL_PP(fd), tmpbuf, Z_LVAL_PP(length));
if (ret >= 0) {
Z_STRVAL_PP(buf) = estrndup(tmpbuf, strlen(tmpbuf));
Z_STRLEN_PP(buf) = ret;
efree(tmpbuf);
RETURN_LONG(ret);
} else {
efree(tmpbuf);
RETURN_LONG(-errno);
}