> 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.

Reply via email to