Skip to content
Snippets Groups Projects
Commit ce3adfe9 authored by Manuel Günther's avatar Manuel Günther
Browse files

Initialize known_magic_number static to avoid race conditions

parent d61dcc30
No related branches found
No related tags found
1 merge request!17Resolve "Load images based on magic numbers instead of filename extension in C++"
Pipeline #
...@@ -11,48 +11,50 @@ ...@@ -11,48 +11,50 @@
namespace bob { namespace io { namespace image { namespace bob { namespace io { namespace image {
const std::string& get_correct_image_extension(const std::string& image_name){ static std::map<std::string, std::vector<std::vector<std::uint8_t>>> _initialize_magic_numbers(){
// global map of known magic numbers
// these numbers are based on: http://stackoverflow.com/questions/26350342/determining-the-extension-type-of-an-image-file-using-binary/26350431#26350431 // these numbers are based on: http://stackoverflow.com/questions/26350342/determining-the-extension-type-of-an-image-file-using-binary/26350431#26350431
static std::map<std::string, std::vector<std::vector<std::uint8_t>>> known_magic_numbers; std::map<std::string, std::vector<std::vector<std::uint8_t>>> magic_numbers;
// BMP
// initialize list, if not done yet magic_numbers[".bmp"].push_back({ 0x42, 0x4D });
if (known_magic_numbers.empty()){ // NetPBM, see https://en.wikipedia.org/wiki/Netpbm_format
// BMP magic_numbers[".pbm"].push_back({ 0x50, 0x31 });// P1
known_magic_numbers[".bmp"].push_back({ 0x42, 0x4D }); magic_numbers[".pbm"].push_back({ 0x50, 0x34 });// P4
// NetPBM, see https://en.wikipedia.org/wiki/Netpbm_format magic_numbers[".pgm"].push_back({ 0x50, 0x32 });// P2
known_magic_numbers[".pbm"].push_back({ 0x50, 0x31 });// P1 magic_numbers[".pgm"].push_back({ 0x50, 0x35 });// P5
known_magic_numbers[".pbm"].push_back({ 0x50, 0x34 });// P4 magic_numbers[".ppm"].push_back({ 0x50, 0x33 });// P3
known_magic_numbers[".pgm"].push_back({ 0x50, 0x32 });// P2 magic_numbers[".ppm"].push_back({ 0x50, 0x36 });// P6
known_magic_numbers[".pgm"].push_back({ 0x50, 0x35 });// P5 // TODO: what about P7?
known_magic_numbers[".ppm"].push_back({ 0x50, 0x33 });// P3
known_magic_numbers[".ppm"].push_back({ 0x50, 0x36 });// P6
// TODO: what about P7?
#ifdef HAVE_GIFLIB #ifdef HAVE_GIFLIB
// GIF // GIF
known_magic_numbers[".gif"].push_back({ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }); magic_numbers[".gif"].push_back({ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 });
known_magic_numbers[".gif"].push_back({ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }); magic_numbers[".gif"].push_back({ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 });
#endif // HAVE_GIFLIB #endif // HAVE_GIFLIB
#ifdef HAVE_LIBPNG #ifdef HAVE_LIBPNG
// PNG // PNG
known_magic_numbers[".png"].push_back({ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }); magic_numbers[".png"].push_back({ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A });
#endif // HAVE_LIB_PNG #endif // HAVE_LIB_PNG
#ifdef HAVE_LIBJPEG #ifdef HAVE_LIBJPEG
// JPEG // JPEG
known_magic_numbers[".jpg"].push_back({ 0xFF, 0xD8, 0xFF }); magic_numbers[".jpg"].push_back({ 0xFF, 0xD8, 0xFF });
known_magic_numbers[".jpg"].push_back({ 0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20 }); magic_numbers[".jpg"].push_back({ 0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20 });
#endif // HAVE_LIBJPEG #endif // HAVE_LIBJPEG
#ifdef HAVE_LIBTIFF #ifdef HAVE_LIBTIFF
// TIFF // TIFF
known_magic_numbers[".tiff"].push_back({ 0x0C, 0xED }); magic_numbers[".tiff"].push_back({ 0x0C, 0xED });
known_magic_numbers[".tiff"].push_back({ 0x49, 0x20, 0x49 }); magic_numbers[".tiff"].push_back({ 0x49, 0x20, 0x49 });
known_magic_numbers[".tiff"].push_back({ 0x49, 0x49, 0x2A, 0x00 }); magic_numbers[".tiff"].push_back({ 0x49, 0x49, 0x2A, 0x00 });
known_magic_numbers[".tiff"].push_back({ 0x4D, 0x4D, 0x00, 0x2A }); magic_numbers[".tiff"].push_back({ 0x4D, 0x4D, 0x00, 0x2A });
known_magic_numbers[".tiff"].push_back({ 0x4D, 0x4D, 0x00, 0x2B }); magic_numbers[".tiff"].push_back({ 0x4D, 0x4D, 0x00, 0x2B });
#endif // HAVE_LIBTIFF #endif // HAVE_LIBTIFF
} return magic_numbers;
}
// global static thread-safe map of known magic numbers
static std::map<std::string, std::vector<std::vector<std::uint8_t>>> known_magic_numbers = _initialize_magic_numbers();
const std::string& get_correct_image_extension(const std::string& image_name){
// read first 8 bytes from file // read first 8 bytes from file
static uint8_t image_bytes[8]; static uint8_t image_bytes[8];
std::ifstream f(image_name); std::ifstream f(image_name);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment