off-by-one in pg_repack index loop

Started by Lakshmi N3 days ago2 messageshackers
Jump to latest
#1Lakshmi N
lakshmin.jhs@gmail.com

Hi hackers,

foreach_current_index returns a 0-based index so
list_length also takes a 0-based index. Perhaps the
check should be list_length(ind_oids_new) <= pos?
Please find the attached patch.

int pos = foreach_current_index(ind_old);

if (unlikely(list_length(ind_oids_new) < pos))
elog(ERROR, "list of new indexes too short");
ident_idx_new = list_nth_oid(ind_oids_new, pos);
break;

Regards,
Lakshmi

Attachments:

0001-Off-by-one-in-repack-index-loop.patchapplication/octet-stream; name=0001-Off-by-one-in-repack-index-loop.patchDownload+1-2
#2Xiaopeng Wang
wxp_728@163.com
In reply to: Lakshmi N (#1)
Re: off-by-one in pg_repack index loop

在 2026/4/14 15:34, Lakshmi N 写道:

Hi hackers,

foreach_current_index returns a 0-based index so
list_length also takes a 0-based index. Perhaps the
check should be list_length(ind_oids_new) <= pos?
Please find the attached patch.

int pos = foreach_current_index(ind_old);

if (unlikely(list_length(ind_oids_new) < pos))
     elog(ERROR, "list of new indexes too short");
ident_idx_new = list_nth_oid(ind_oids_new, pos);
break;

Regards,
Lakshmi

This fix looks correct to me. Both foreach_current_index(), so 0<=pos<list_length is expected.

Regard,
Xiaopeng Wang