From 9ed4f515d16ccacacffa5092b39f55ba5322054d Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Wed, 29 Nov 2006 11:10:49 +0000 Subject: [PATCH] fix #39673 (file_get_contents causes bus error on certain offsets) --- ext/standard/tests/file/bug39673.phpt | 40 +++++++++++++++++++++++++++ main/streams/plain_wrapper.c | 7 +++++ 2 files changed, 47 insertions(+) create mode 100644 ext/standard/tests/file/bug39673.phpt diff --git a/ext/standard/tests/file/bug39673.phpt b/ext/standard/tests/file/bug39673.phpt new file mode 100644 index 0000000000..3836f2103d --- /dev/null +++ b/ext/standard/tests/file/bug39673.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #39673 (file_get_contents causes bus error on certain offsets) +--FILE-- + +--EXPECTF-- +int(13824) +int(13824) +int(0) +int(1) +int(0) +int(11824) +int(8824) +int(0) +Done diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 1b9e1c2501..979725d590 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -631,9 +631,16 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void case PHP_STREAM_MMAP_MAP_RANGE: do_fstat(data, 1); + if (range->length == 0 && range->offset > 0 && range->offset < data->sb.st_size) { + range->length = data->sb.st_size - range->offset; + } if (range->length == 0 || range->length > data->sb.st_size) { range->length = data->sb.st_size; } + if (range->offset >= data->sb.st_size) { + range->offset = data->sb.st_size; + range->length = 0; + } switch (range->mode) { case PHP_STREAM_MAP_MODE_READONLY: prot = PROT_READ; -- 2.50.1