Alexander Korotkov <aekorot...@gmail.com> writes:
> With current head I can't load delicious dataset into jsonb format. I got
> segfault. It looks like memory corruption.

The proximate cause of this seems to be that reserveFromBuffer() fails
to consider the possibility that it needs to more-than-double the
current buffer size.  This change makes the crash go away for me:

diff --git a/src/backend/utils/adt/jsonb_util.c 
b/src/backend/utils/adt/jsonb_util.c
index 832a08d..0c4af04 100644
*** a/src/backend/utils/adt/jsonb_util.c
--- b/src/backend/utils/adt/jsonb_util.c
*************** reserveFromBuffer(convertState *buffer, 
*** 1186,1192 ****
        /* Make more room if needed */
        if (buffer->len + len > buffer->allocatedsz)
        {
!               buffer->allocatedsz *= 2;
                buffer->buffer = repalloc(buffer->buffer, buffer->allocatedsz);
        }
  
--- 1186,1195 ----
        /* Make more room if needed */
        if (buffer->len + len > buffer->allocatedsz)
        {
!               do
!               {
!                       buffer->allocatedsz *= 2;
!               } while (buffer->len + len > buffer->allocatedsz);
                buffer->buffer = repalloc(buffer->buffer, buffer->allocatedsz);
        }
  

However, what it looks to me like we've got here is a very bad
reimplementation of StringInfo buffers.  There is for example no
integer-overflow checking here.  Rather than try to bring this code
up to speed, I think we should rip it out and use StringInfo.

                        regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to