]> git.eshelyaron.com Git - emacs.git/commitdiff
Defend fingerprint against even-smarter LTO
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 9 Jul 2019 20:55:16 +0000 (13:55 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 9 Jul 2019 20:56:45 +0000 (13:56 -0700)
* src/pdumper.c (Fdump_emacs_portable, pdumper_load):
Don’t cast volatile to non-volatile pointer, as that does not in
general suffice to prevent a compiler from optimizing away memcmp
and/or memcpy calls.  Instead, copy the fingerprint by hand.

src/pdumper.c

index 7d29d3c0c836a750bcc5efb6186a5967a06f71bb..3d8531c6a43c57e05b9a2ed89a535e213846e592 100644 (file)
@@ -4101,8 +4101,8 @@ types.  */)
   ctx->header.magic[0] = '!'; /* Note that dump is incomplete.  */
 
   verify (sizeof (fingerprint) == sizeof (ctx->header.fingerprint));
-  memcpy (ctx->header.fingerprint, (unsigned char *) fingerprint,
-         sizeof (fingerprint));
+  for (int i = 0; i < sizeof fingerprint; i++)
+    ctx->header.fingerprint[i] = fingerprint[i];
 
   const dump_off header_start = ctx->offset;
   dump_fingerprint ("dumping fingerprint", ctx->header.fingerprint);
@@ -5360,10 +5360,12 @@ pdumper_load (const char *dump_filename)
 
   err = PDUMPER_LOAD_VERSION_MISMATCH;
   verify (sizeof (header->fingerprint) == sizeof (fingerprint));
-  if (memcmp (header->fingerprint, (unsigned char *) fingerprint,
-             sizeof (fingerprint)) != 0)
+  unsigned char desired[sizeof fingerprint];
+  for (int i = 0; i < sizeof fingerprint; i++)
+    desired[i] = fingerprint[i];
+  if (memcmp (header->fingerprint, desired, sizeof desired) != 0)
     {
-      dump_fingerprint ("desired fingerprint", (unsigned char *) fingerprint);
+      dump_fingerprint ("desired fingerprint", desired);
       dump_fingerprint ("found fingerprint", header->fingerprint);
       goto out;
     }