[BUGS] 答复: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border - Mailing list pgsql-bugs

From shao bret
Subject [BUGS] 答复: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border
Date
Msg-id HK2PR0201MB0882B337333AFED3FBDA1DC9E6010@HK2PR0201MB0882.apcprd02.prod.outlook.com
Whole thread Raw
In response to Re: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border  (Michael Paquier <michael.paquier@gmail.com>)
Responses [BUGS] Re: 答复: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border  (Michael Paquier <michael.paquier@gmail.com>)
Re: [BUGS] 答复: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border  (Andres Freund <andres@anarazel.de>)
List pgsql-bugs

Hi Michael,

Thanks for your quickly response!

I think maybe you have a little misunderstanding with my solution.

 

My solution is that

      if (!found)

       {

              int                 i;

              MemSet(replication_states_ctl, 0, ReplicationOriginShmemSize());

              replication_states_ctl->tranche_id = LWLockNewTrancheId();

              replication_states_ctl->tranche.name = "ReplicationOrigins";

              replication_states_ctl->tranche.array_base =

                     &replication_states[0].lock;

              replication_states_ctl->tranche.array_stride =

                     sizeof(ReplicationState);

 

              //MemSet(replication_states, 0, ReplicationOriginShmemSize());

 

              for (i = 0; i < max_replication_slots; i++)

                     LWLockInitialize(&replication_states[i].lock,

                                                 replication_states_ctl->tranche_id);

       }

So I think it’s easier for understanding code.

What do you think?

 

Thanks.

Bret

 

发送自 Windows 10 邮件应用

 

发件人: Michael Paquier
发送时间: 2017410 14:39
收件人: bret.shao@outlook.com
抄送: PostgreSQL mailing lists; Andres Freund
主题: Re: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border

 

On Mon, Apr 10, 2017 at 3:26 PM,  <bret.shao@outlook.com> wrote:
> MemSet(replication_states, 0, ReplicationOriginShmemSize()); in function
> ReplicationOriginShmemInit cause cross-border,because that start address of
> the share memory allocated is replication_states_ctl, but call MemSet to
> initialize this memory start from replication_states which is variable
> states's address in struct ReplicationStateCtl.so call MemSet to set 0 with
> the total size of this share memory will cross border of this share memory.
>
> Although, this cross-border will not caused the system failure due to share
> memory allocation strategy after my analysis. but i still believe we
> shouldn't do like this.
>
> Fix suggestion:
> change to
>  MemSet(replication_states_ctl, 0, ReplicationOriginShmemSize()); then move
> to the beginning of if statement.

Yes, there is a mistake here, but I don't agree with your solution. It
seems to me that using mul_size(max_replication_slots,
sizeof(ReplicationState)) is the way to go as you would reinitialize
what has been set in tranche_id. Per se the attached.
--
Michael

 

pgsql-bugs by date:

Previous
From: Michael Paquier
Date:
Subject: Re: [BUGS] BUG #14615: ReplicationOriginShmemInit Memory access cross-border
Next
From: balazs@obiserver.hu
Date:
Subject: [BUGS] BUG #14616: error message without schema