From 0f83f0aa0b8340f2d59bb3a4e174585780a2c54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 14 Nov 2017 09:02:03 +0100 Subject: [PATCH] Store integer magic in cache file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows to detect different endianity of machines to avoid loading caches created with different endianity. Fixes #36 Signed-off-by: Michal Čihař --- src/stardict_lib.cpp | 12 ++++++++++-- tests/rus-eng-stardict-2.4.2/1.xdxf.idx.oft | Bin 38 -> 42 bytes 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/stardict_lib.cpp b/src/stardict_lib.cpp index 63e23f5..a911ddd 100644 --- a/src/stardict_lib.cpp +++ b/src/stardict_lib.cpp @@ -491,7 +491,8 @@ private: static std::list get_cache_variant(const std::string &url); }; -const char *OffsetIndex::CACHE_MAGIC = "StarDict's Cache, Version: 0.1"; +const char *OffsetIndex::CACHE_MAGIC = "StarDict's Cache, Version: 0.2"; +#define CACHE_MAGIC_BYTES 0x51a4d1c1 class WordListIndex : public IIndexFile { @@ -573,7 +574,11 @@ bool OffsetIndex::load_cache(const std::string &url) continue; if (strncmp(mf.begin(), CACHE_MAGIC, strlen(CACHE_MAGIC)) != 0) continue; - memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC), wordoffset.size() * sizeof(wordoffset[0])); + guint32 tmp; + memcpy(&tmp, mf.begin() + strlen(CACHE_MAGIC), sizeof(tmp)); + if (tmp != CACHE_MAGIC_BYTES) + continue; + memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC) + sizeof(guint32), wordoffset.size() * sizeof(wordoffset[0])); return true; } @@ -605,10 +610,13 @@ bool OffsetIndex::save_cache(const std::string &url, bool verbose) const std::list vars = get_cache_variant(url); for (const std::string &item : vars) { FILE *out = fopen(item.c_str(), "wb"); + guint32 magic = CACHE_MAGIC_BYTES; if (!out) continue; if (fwrite(CACHE_MAGIC, 1, strlen(CACHE_MAGIC), out) != strlen(CACHE_MAGIC)) continue; + if (fwrite(&magic, 1, sizeof(magic), out) != sizeof(magic)) + continue; if (fwrite(&wordoffset[0], sizeof(wordoffset[0]), wordoffset.size(), out) != wordoffset.size()) continue; fclose(out); diff --git a/tests/rus-eng-stardict-2.4.2/1.xdxf.idx.oft b/tests/rus-eng-stardict-2.4.2/1.xdxf.idx.oft index bd5c857158ce9e288f07f6cdbe377c9ed82e942b..d505d33d94855e8f229d7073688eaafb8ed15ccb 100644 GIT binary patch delta 18 WcmY$>njp(-bnxPmKn5TX2Vwv(9|PL} delta 14 ScmdN=n;^?+$N&W5Knws5wgFE7