# Question about buffer size calculation in _php_stream_copy_to_mem_ex

- Thread: https://externals.io/message/46101
- Original archive: https://news-web.php.net/php.internals/46101
- Started by Arvind Srinivasan on 2009-11-19T12:42:35+00:00
- Messages: 1
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #46101 — Arvind Srinivasan — 2009-11-19T12:42:35+00:00

URL: https://externals.io/message/46101#46101

I see the following in _php_stream_copy_to_mem_ex in main/streams/streams.c

	int step = CHUNK_SIZE;
	int min_room = CHUNK_SIZE / 4;

        (..stuff deleted..)

	/* avoid many reallocs by allocating a good sized chunk to begin with, if
	 * we can.  Note that the stream may be filtered, in which case the stat
	 * result may be inaccurate, as the filter may inflate or deflate the
	 * number of bytes that we can read.  In order to avoid an upsize followed
	 * by a downsize of the buffer, overestimate by the step size (which is
	 * 2K).  */
	if (php_stream_stat(src, &ssbuf) == 0 && ssbuf.sb.st_size > 0) {
		max_len = ssbuf.sb.st_size + step;
	} else {
		max_len = step;
	}

According to the comment the intention is to overestimate by 2K, but
CHUNK_SIZE = 8192 and that leads quite a bit of over-allocation of
memory.

Is the following a better setting for max_len in the if block?

max_len = (((ssbuf.sb.st_size + min_room)/step) + 1) * step;

The following are sample values that show the current vs new size calculation.
ssbuf.sb.st_size, max_len (current), max_len (new)
(     100,    8292,    8192)
(   1000,    9192,    8192)
(   5000,  13192,    8192)
(   7000,  15192,  16384)
( 13000,  21192,  16384)
( 22000,  30192,  24576)

thanks,
arvi
