Browse Source

AP_ROMFS: added crc check in ROMFS decompression

zr-v5.1
Andrew Tridgell 4 years ago
parent
commit
f7098c1635
  1. 12
      libraries/AP_ROMFS/AP_ROMFS.cpp
  2. 3
      libraries/AP_ROMFS/AP_ROMFS.h

12
libraries/AP_ROMFS/AP_ROMFS.cpp

@ -18,6 +18,7 @@
#include "AP_ROMFS.h" #include "AP_ROMFS.h"
#include "tinf.h" #include "tinf.h"
#include <AP_Math/crc.h>
#ifdef HAL_HAVE_AP_ROMFS_EMBEDDED_H #ifdef HAL_HAVE_AP_ROMFS_EMBEDDED_H
#include <ap_romfs_embedded.h> #include <ap_romfs_embedded.h>
@ -28,11 +29,12 @@ const AP_ROMFS::embedded_file AP_ROMFS::files[] = {};
/* /*
find an embedded file find an embedded file
*/ */
const uint8_t *AP_ROMFS::find_file(const char *name, uint32_t &size) const uint8_t *AP_ROMFS::find_file(const char *name, uint32_t &size, uint32_t &crc)
{ {
for (uint16_t i=0; i<ARRAY_SIZE(files); i++) { for (uint16_t i=0; i<ARRAY_SIZE(files); i++) {
if (strcmp(name, files[i].filename) == 0) { if (strcmp(name, files[i].filename) == 0) {
size = files[i].size; size = files[i].size;
crc = files[i].crc;
return files[i].contents; return files[i].contents;
} }
} }
@ -48,7 +50,8 @@ const uint8_t *AP_ROMFS::find_file(const char *name, uint32_t &size)
const uint8_t *AP_ROMFS::find_decompress(const char *name, uint32_t &size) const uint8_t *AP_ROMFS::find_decompress(const char *name, uint32_t &size)
{ {
uint32_t compressed_size = 0; uint32_t compressed_size = 0;
const uint8_t *compressed_data = find_file(name, compressed_size); uint32_t crc;
const uint8_t *compressed_data = find_file(name, compressed_size, crc);
if (!compressed_data) { if (!compressed_data) {
return nullptr; return nullptr;
} }
@ -101,6 +104,11 @@ const uint8_t *AP_ROMFS::find_decompress(const char *name, uint32_t &size)
return nullptr; return nullptr;
} }
if (crc32_small(0, decompressed_data, decompressed_size) != crc) {
::free(decompressed_data);
return nullptr;
}
size = decompressed_size; size = decompressed_size;
return decompressed_data; return decompressed_data;
#endif #endif

3
libraries/AP_ROMFS/AP_ROMFS.h

@ -25,11 +25,12 @@ public:
private: private:
// find an embedded file // find an embedded file
static const uint8_t *find_file(const char *name, uint32_t &size); static const uint8_t *find_file(const char *name, uint32_t &size, uint32_t &crc);
struct embedded_file { struct embedded_file {
const char *filename; const char *filename;
uint32_t size; uint32_t size;
uint32_t crc;
const uint8_t *contents; const uint8_t *contents;
}; };
static const struct embedded_file files[]; static const struct embedded_file files[];

Loading…
Cancel
Save