aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/crcutil/protected_crc.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/crcutil/protected_crc.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/crcutil/protected_crc.h')
-rw-r--r--contrib/libs/crcutil/protected_crc.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/libs/crcutil/protected_crc.h b/contrib/libs/crcutil/protected_crc.h
new file mode 100644
index 0000000000..762fceda9b
--- /dev/null
+++ b/contrib/libs/crcutil/protected_crc.h
@@ -0,0 +1,61 @@
+// Copyright 2010 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Protects CRC tables with its own CRC.
+// CRC tables get corrupted too, and if corruption is
+// not caught, data poisoning becomes a reality.
+
+#ifndef CRCUTIL_PROTECTED_CRC_H_
+#define CRCUTIL_PROTECTED_CRC_H_
+
+namespace crcutil {
+
+#pragma pack(push, 16)
+
+// Class CrcImplementation should not have virtual functions:
+// vptr is stored as the very first field, vptr value is defined
+// at runtime, so it is impossible to CRC(*this) once and
+// guarantee that this value will not change from run to run.
+//
+template<typename CrcImplementation> class ProtectedCrc
+ : public CrcImplementation {
+ public:
+ typedef typename CrcImplementation::Crc Crc;
+
+ // Returns check value that the caller should compare
+ // against pre-computed, trusted constant.
+ //
+ // Computing SelfCheckValue() after CRC initialization,
+ // storing it in memory, and periodically checking against
+ // stored value may not work: if CRC tables were initialized
+ // incorrectly and/or had been corrupted during initialization,
+ // CheckValue() will return garbage. Garbage in, garbage out.
+ // Consequitive checks will not detect a problem, the application
+ // will happily produce and save the data with corrupt CRC.
+ //
+ // The application should call SelfCheckValue() regularly:
+ // 1. First and foremost, on every CRC mismatch.
+ // 2. After CRC'ing the data but before sending it out or writing it.
+ // 3. Worst case, every Nth CRC'ed byte or every Nth call to CRC.
+ //
+ Crc SelfCheckValue() const {
+ return CrcDefault(this, sizeof(*this), 0);
+ }
+} GCC_ALIGN_ATTRIBUTE(16);
+
+#pragma pack(pop)
+
+} // namespace crcutil
+
+#endif // CRCUTIL_PROTECTED_CRC_H_