git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2e0fedf)
Avoid memcpy() with same source and destination during relmapper init.
2020年12月18日 20:46:44 +0000 (15:46 -0500)
2020年12月18日 20:46:44 +0000 (15:46 -0500)
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 also 5b630501e, 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


diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c
index 671fbb0ed5c5f8ca0ec00c5f55aa72fe5ec45742..73e45eb4846ce0bc43dfbef2b5766b83870cd5d1 100644 (file)
--- a/src/backend/utils/cache/relmapper.c
+++ b/src/backend/utils/cache/relmapper.c
@@ -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)
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /