mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-06 13:07:10 +02:00
Avoid memcpy() with same source and destination during relmapper init.
A narrow reading of the C standard says that memcpy(x,x,n) is undefined, although it's hard to envision an implementation that would really misbehave. However, analysis tools such as valgrind might whine about this; accordingly, let's band-aid relmapper.c to not do it. See also5b630501e
,d3f4e8a8a
,ad7b48ea0
, and other similar fixes. Apparently, none of those folk tried valgrinding initdb? This has been like this for long enough that I'm surprised it hasn't been reported before. Back-patch, just in case anybody wants to use a back branch on a platform that complains about this; we back-patched those earlier fixes too. Discussion: https://postgr.es/m/161790.1608310142@sss.pgh.pa.us
This commit is contained in:
parent
d28a14d2d4
commit
722eb325b9
11
src/backend/utils/cache/relmapper.c
vendored
11
src/backend/utils/cache/relmapper.c
vendored
@ -928,8 +928,15 @@ write_relmap_file(bool shared, RelMapFile *newmap,
|
||||
}
|
||||
}
|
||||
|
||||
/* Success, update permanent copy */
|
||||
memcpy(realmap, newmap, sizeof(RelMapFile));
|
||||
/*
|
||||
* Success, update permanent copy. During bootstrap, we might be working
|
||||
* on the permanent copy itself, in which case skip the memcpy() to avoid
|
||||
* invoking nominally-undefined behavior.
|
||||
*/
|
||||
if (realmap != newmap)
|
||||
memcpy(realmap, newmap, sizeof(RelMapFile));
|
||||
else
|
||||
Assert(!send_sinval); /* must be bootstrapping */
|
||||
|
||||
/* Critical section done */
|
||||
if (write_wal)
|
||||
|
Loading…
Reference in New Issue
Block a user