memset (key, '\0', sizeof(key));
}
+bool
+StoreSwapLogData::sane() const
+{
+ // TODO: These checks are rather weak. A corrupted swap.state may still
+ // cause havoc (e.g., cur_size may become astronomical). Add checksums?
+
+ const time_t minTime = -2; // -1 is common; expires sometimes uses -2
+
+ // Check what we safely can; for some fields any value might be valid
+ return SWAP_LOG_NOP < op && op < SWAP_LOG_MAX &&
+ swap_filen >= 0 &&
+ timestamp >= minTime &&
+ lastref >= minTime &&
+ expires >= minTime &&
+ lastmod >= minTime &&
+ swap_file_sz > 0; // because swap headers ought to consume space
+}
+
StoreSwapLogHeader::StoreSwapLogHeader():op(SWAP_LOG_VERSION), version(1)
{
record_size = sizeof(StoreSwapLogData);
MEMPROXY_CLASS(StoreSwapLogData);
StoreSwapLogData();
+ /// consistency self-check: whether the data appears to make sense
+ bool sane() const;
+
/**
* Either SWAP_LOG_ADD when an object is added to the disk storage,
* or SWAP_LOG_DEL when an object is deleted.
while (fread(&s, sizeof(s), 1, file) == 1) {
count++;
idx->scanned_count++;
- /* if (s.op <= SWAP_LOG_NOP || s.op >= SWAP_LOG_MAX)
+ /* if (!s.sane())
* continue; */
if (s.op == SWAP_LOG_ADD) {
n_read++;
- if (swapData.op <= SWAP_LOG_NOP)
- continue;
-
- if (swapData.op >= SWAP_LOG_MAX)
+ if (!swapData.sane()) {
+ counts.invalid++;
continue;
+ }
/*
* BC: during 2.4 development, we changed the way swap file