Re: Avoid incomplete copy string (src/backend/access/transam/xlog.c)

Поиск
Список
Период
Сортировка
От Ranier Vilela
Тема Re: Avoid incomplete copy string (src/backend/access/transam/xlog.c)
Дата
Msg-id CAEudQArgZA3pnrAtG15wDUcW_hLLPv69otLBaiTak9nLZr7MOg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Avoid incomplete copy string (src/backend/access/transam/xlog.c)  (Richard Guo <guofenglinux@gmail.com>)
Список pgsql-hackers


Em dom., 23 de jun. de 2024 às 23:56, Richard Guo <guofenglinux@gmail.com> escreveu:
On Mon, Jun 24, 2024 at 7:51 AM Ranier Vilela <ranier.vf@gmail.com> wrote:
> In src/include/access/xlogbackup.h, the field *name*
> has one byte extra to store null-termination.
>
> But, in the function *do_pg_backup_start*,
> I think that is a mistake in the line (8736):
>
> memcpy(state->name, backupidstr, strlen(backupidstr));
>
> memcpy with strlen does not copy the whole string.
> strlen returns the exact length of the string, without
> the null-termination.

I noticed that the two callers of do_pg_backup_start both allocate
BackupState with palloc0.  Can we rely on this to ensure that the
BackupState.name is initialized with null-termination?
I do not think so.
It seems to me the best solution is to use Michael's suggestion, strlcpy + sizeof.

Currently we have this:
memcpy(state->name, "longlongpathexample1", strlen("longlongpathexample1"));
printf("%s\n", state->name);
longlongpathexample1

Next random call:
memcpy(state->name, "longpathexample2", strlen("longpathexample2"));
printf("%s\n", state->name);
longpathexample2ple1

It's not a good idea to use memcpy with strlen.

best regards,
Ranier Vilela

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Amit Langote
Дата:
Сообщение: Re: sql/json miscellaneous issue
Следующее
От: Ranier Vilela
Дата:
Сообщение: Re: Avoid incomplete copy string (src/backend/access/transam/xlog.c)