feat(deserializer): protect against corrupted binary files
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
c473a484bb
commit
1f6e959139
7 changed files with 12 additions and 6 deletions
|
@ -459,7 +459,7 @@ public:
|
|||
name n = read_name(d);
|
||||
return mk_metavar(n, read_local_context(d));
|
||||
}}
|
||||
lean_unreachable(); // LCOV_EXCL_LINE
|
||||
throw_corrupted_file();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
@ -308,7 +308,7 @@ public:
|
|||
}
|
||||
return max_core(lvls.size(), lvls.data());
|
||||
}}
|
||||
lean_unreachable();
|
||||
throw_corrupted_file();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
@ -404,7 +404,7 @@ public:
|
|||
name prefix = read();
|
||||
return name(prefix, d.read_unsigned());
|
||||
}}
|
||||
lean_unreachable(); // LCOV_EXCL_LINE
|
||||
throw_corrupted_file();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
@ -7,7 +7,6 @@ Author: Leonardo de Moura
|
|||
#pragma once
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include "util/exception.h"
|
||||
#include "util/serializer.h"
|
||||
|
||||
#ifndef LEAN_OBJECT_SERIALIZER_BUCKET_SIZE
|
||||
|
@ -62,7 +61,7 @@ public:
|
|||
} else {
|
||||
unsigned i = d.read_unsigned();
|
||||
if (i >= m_table.size())
|
||||
throw exception("corrupted binary file");
|
||||
throw_corrupted_file();
|
||||
return m_table[i];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ Author: Leonardo de Moura
|
|||
#include <stdio.h>
|
||||
#include <ios>
|
||||
#include "util/serializer.h"
|
||||
#include "util/exception.h"
|
||||
|
||||
namespace lean {
|
||||
void serializer_core::write_unsigned(unsigned i) {
|
||||
|
@ -69,4 +70,8 @@ double deserializer_core::read_double() {
|
|||
in >> r;
|
||||
return r;
|
||||
}
|
||||
|
||||
void throw_corrupted_file() {
|
||||
throw exception("corrupted binary file");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,4 +63,6 @@ inline deserializer & operator>>(deserializer & d, int & i) { i = d.read_int();
|
|||
inline deserializer & operator>>(deserializer & d, char & c) { c = d.read_char(); return d; }
|
||||
inline deserializer & operator>>(deserializer & d, bool & b) { b = d.read_bool(); return d; }
|
||||
inline deserializer & operator>>(deserializer & d, double & b) { b = d.read_double(); return d; }
|
||||
|
||||
[[ noreturn ]] void throw_corrupted_file();
|
||||
}
|
||||
|
|
|
@ -336,7 +336,7 @@ public:
|
|||
sexpr t = read();
|
||||
return sexpr(h, t);
|
||||
}}
|
||||
lean_unreachable();
|
||||
throw_corrupted_file();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue