summaryrefslogtreecommitdiff
path: root/py/sequence.c
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-02-04 21:23:27 -0800
committerGitHub <noreply@github.com>2019-02-04 21:23:27 -0800
commit041a84e8f962e3591d1aa565cd6cea5a73d6d882 (patch)
tree1f62a987e90a7cad559af2c207cc6ada778fba98 /py/sequence.c
parent9bcc38e995648493fe35ad63a18bd65d63f64c21 (diff)
parent844c20106bee7639f5fa83535806932bae354a71 (diff)
Merge pull request #1520 from tannewt/check_seq_multiply_for_overflow
Check sequence multiply for length overflow
Diffstat (limited to 'py/sequence.c')
-rw-r--r--py/sequence.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/py/sequence.c b/py/sequence.c
index cc31be983..a750e5bac 100644
--- a/py/sequence.c
+++ b/py/sequence.c
@@ -34,6 +34,15 @@
#define SWAP(type, var1, var2) { type t = var2; var2 = var1; var1 = t; }
+// Detect when a multiply causes an overflow.
+size_t mp_seq_multiply_len(size_t item_sz, size_t len) {
+ size_t new_len;
+ if (__builtin_mul_overflow(item_sz, len, &new_len)) {
+ mp_raise_msg(&mp_type_OverflowError, translate("small int overflow"));
+ }
+ return new_len;
+}
+
// Implements backend of sequence * integer operation. Assumes elements are
// memory-adjacent in sequence.
void mp_seq_multiply(const void *items, size_t item_sz, size_t len, size_t times, void *dest) {