Re: Compressed TOAST Slicing
От | Andrey Borodin |
---|---|
Тема | Re: Compressed TOAST Slicing |
Дата | |
Msg-id | AB33DB45-67B5-43C8-87A9-C4E3DF8EB447@yandex-team.ru обсуждение исходный текст |
Ответ на | Re: Compressed TOAST Slicing (Paul Ramsey <pramsey@cleverelephant.ca>) |
Ответы |
Re: Compressed TOAST Slicing
|
Список | pgsql-hackers |
> 13 марта 2019 г., в 21:05, Paul Ramsey <pramsey@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.
В списке pgsql-hackers по дате отправления: