> 13 марта 2019 г., в 21:05, Paul Ramsey <pram...@cleverelephant.ca> написал(а):
>
> Here is a new (final?) patch ...
>
> <compressed-datum-slicing-20190313a.patch>
This check
@@ -744,6 +748,8 @@ pglz_decompress(const char *source, int32 slen, char *dest,
{
*dp = dp[-off];
dp++;
+ if (dp >= destend) /* check for
buffer overrun */
+ break; /* do not
clobber memory */
}
is still done for every byte. You can precompute maximum allowed length before
that cycle. Here's diff
diff --git a/src/common/pg_lzcompress.c b/src/common/pg_lzcompress.c
index 6b48892a8f..05b2b3d5d1 100644
--- a/src/common/pg_lzcompress.c
+++ b/src/common/pg_lzcompress.c
@@ -744,12 +744,11 @@ pglz_decompress_checked(const char *source, int32 slen,
char *dest,
* memcpy() here, because the copied areas
could overlap
* extremely!
*/
+ len = Min(len, destend - dp);
while (len--)
{
*dp = dp[-off];
dp++;
- if (dp >= destend) /* check for
buffer overrun */
- break; /* do not
clobber memory */
}
}
else
Best regards, Andrey Borodin.