Skip to content

Commit 8c8ba6d

Browse files
committed
Add comment on why pulling data from a "name" index column can't crash.
It's been bothering me for several days that pretending that the cstring data stored in a btree name_ops column is really a "name" Datum could lead to reading past the end of memory. However, given the current memory layout used for index-only scans in the btree code, a crash is in fact not possible. Document that so we don't break it. I have not thought of any other solutions that aren't fairly ugly too, and most of them lose the functionality of index-only scans on name columns altogether, so this seems like the way to go.
1 parent cb6771f commit 8c8ba6d

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

src/backend/access/nbtree/nbtree.c

+10
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,16 @@ btrescan(PG_FUNCTION_ARGS)
433433
* not already done in a previous rescan call. To save on palloc
434434
* overhead, both workspaces are allocated as one palloc block; only this
435435
* function and btendscan know that.
436+
*
437+
* NOTE: this data structure also makes it safe to return data from a
438+
* "name" column, even though btree name_ops uses an underlying storage
439+
* datatype of cstring. The risk there is that "name" is supposed to be
440+
* padded to NAMEDATALEN, but the actual index tuple is probably shorter.
441+
* However, since we only return data out of tuples sitting in the
442+
* currTuples array, a fetch of NAMEDATALEN bytes can at worst pull some
443+
* data out of the markTuples array --- running off the end of memory for
444+
* a SIGSEGV is not possible. Yeah, this is ugly as sin, but it beats
445+
* adding special-case treatment for name_ops elsewhere.
436446
*/
437447
if (scan->xs_want_itup && so->currTuples == NULL)
438448
{

0 commit comments

Comments
 (0)