/* Logging infrastructure for ensuring operations are persistently recorded to
* disk. */
#define BLUESKY_CRC32C_SEED (~(uint32_t)0)
+#define BLUESKY_CRC32C_VALIDATOR ((uint32_t)0xb798b438UL)
uint32_t crc32c(uint32_t crc, const char *buf, unsigned int length);
uint32_t crc32c_finalize(uint32_t crc);
#include <stdint.h>
#include "bluesky-private.h"
+/* Generator polynomial is 0x1edc6f41; input and output are reflected. The
+ * recommended starting value for the accumulator is ~0, and the bits of the
+ * CRC are inverted at the end as well. */
+
static const uint32_t crc32c_table[256] = {
0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
uint32_t crc32c_finalize(uint32_t crc)
{
- return GUINT32_TO_LE(crc);
+ return ~GUINT32_TO_LE(crc);
}
uint32_t crc = crc32c(BLUESKY_CRC32C_SEED, buf + offset,
sizeof(struct log_header) + sizeof(struct log_footer)
+ size);
- if (crc != 0)
+ if (crc != BLUESKY_CRC32C_VALIDATOR) {
+ g_warning("Journal entry failed to validate: CRC %08x != %08x",
+ crc, BLUESKY_CRC32C_VALIDATOR);
return FALSE;
+ }
return TRUE;
}