Re: BUG #17994: Invalidating relcache corrupts tupDesc inside ExecEvalFieldStoreDeForm()
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: exclusion@gmail.com
Cc: pgsql-bugs@lists.postgresql.org, Andrew Dunstan <andrew@dunslane.net>
Date: 2023-06-28T18:49:34Z
Lists: pgsql-bugs
Attachments
- fix-ExecEvalFieldStoreDeForm.patch (text/x-diff) patch
PG Bug reporting form <noreply@postgresql.org> writes: > The following script: > ... > invokes errors or a server crash: Thanks for the report! The good news is that the case shown here is easily fixed, as attached. get_cached_rowtype() explicitly specifies that its result doesn't hold good across database access if you don't increment the tupdesc's refcount. Most of the callers get this right, but ExecEvalFieldStoreDeForm() is doing things in the wrong order by fetching the tupdesc before detoasting the input datum. We could fix that by temporarily incrementing the refcount, but I don't see any reason we can't just reorder the steps to make it safe. The bad news is that while investigating this I came across another hazard that seems much messier to fix. To wit, if you have a tuple with "missing" pass-by-ref columns, then some of the columns output by heap_deform_tuple() will contain pointers into the tupdesc (cf. getmissingattr()). That's not sufficient lifespan in the scenario we're dealing with here: if the tupdesc gets trashed anytime before the eventual ExecEvalFieldStoreForm(), we'll have garbage in the result tuple. Worse, I fear there may be many other places with latent bugs of the same ilk. Before the attmissingval code was added, one could assume that the result of heap_deform_tuple would hold good as long as you had a pin on the source tuple. But now it depends on metadata as well, and I don't think we have a coherent story about that. Any thoughts what to do? I considered making getmissingattr apply datumCopy, but that would probably lead to unpleasant memory leaks. regards, tom lane
Commits
-
Cache by-reference missing values in a long lived context
- 2d13dab048a7 11.22 landed
- f938acd68b08 16.0 landed
- a68458108512 17.0 landed
- 75f323aa1c1e 15.5 landed
- 7f4515a58ebd 14.10 landed
- 1bb619d4d628 13.13 landed
- 01993ac748fd 12.17 landed
-
Fix order of operations in ExecEvalFieldStoreDeForm().
- d0ab203bc192 13.12 landed
- cc8cca3c2d60 15.4 landed
- 7f11b7a9cf18 11.21 landed
- 53b93e853ffe 12.16 landed
- 43af714defa0 16.0 landed
- 0789b82a9792 14.9 landed