diff options
| author | Scott Shawcroft <scott@adafruit.com> | 2019-05-10 12:23:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-10 12:23:31 -0700 |
| commit | da2c88eaacf9c859cdda452a88ad5e552df98466 (patch) | |
| tree | c4cd5e8110b976d5c74747e390fa067f8e01694a | |
| parent | 46164c6ec6d6bc23feafbfce5b08e5307daac1f7 (diff) | |
| parent | 67007282c9036cc81e6cea0fab5a4378bc3ae743 (diff) | |
Merge pull request #1860 from godlygeek/int_to_bytes_overflow_checks
Add overflow checks for int to bytes conversions
| -rw-r--r-- | locale/ID.po | 19 | ||||
| -rw-r--r-- | locale/circuitpython.pot | 7 | ||||
| -rw-r--r-- | locale/de_DE.po | 19 | ||||
| -rw-r--r-- | locale/en_US.po | 19 | ||||
| -rw-r--r-- | locale/en_x_pirate.po | 19 | ||||
| -rw-r--r-- | locale/es.po | 19 | ||||
| -rw-r--r-- | locale/fil.po | 19 | ||||
| -rw-r--r-- | locale/fr.po | 19 | ||||
| -rw-r--r-- | locale/it_IT.po | 19 | ||||
| -rw-r--r-- | locale/pl.po | 19 | ||||
| -rw-r--r-- | locale/pt_BR.po | 19 | ||||
| -rw-r--r-- | locale/zh_Latn_pinyin.po | 19 | ||||
| -rw-r--r-- | ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk | 2 | ||||
| -rw-r--r-- | py/binary.c | 18 | ||||
| -rw-r--r-- | py/objint.c | 34 | ||||
| -rw-r--r-- | py/objint.h | 1 | ||||
| -rw-r--r-- | py/runtime.c | 8 | ||||
| -rw-r--r-- | py/runtime.h | 1 | ||||
| -rw-r--r-- | tests/basics/array_overflow.py | 35 | ||||
| -rw-r--r-- | tests/basics/int_bytes.py | 12 | ||||
| -rw-r--r-- | tests/basics/int_bytes_intbig.py | 12 | ||||
| -rw-r--r-- | tests/basics/struct_overflow.py | 47 |
22 files changed, 303 insertions, 83 deletions
diff --git a/locale/ID.po b/locale/ID.po index eccaf2adf..551c253c7 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -52,8 +52,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "buffers harus mempunyai panjang yang sama" @@ -253,8 +253,8 @@ msgstr "Semua channel event yang disinkronisasi sedang digunakan" msgid "All timers for this pin are in use" msgstr "Semua timer untuk pin ini sedang digunakan" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -751,8 +751,8 @@ msgstr "" msgid "Input/output error" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "%q pada tidak valid" @@ -1076,8 +1076,8 @@ msgstr "" msgid "Sample rate too high. It must be less than %d" msgstr "Nilai sampel terlalu tinggi. Nilai harus kurang dari %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer sedang digunakan" @@ -1216,8 +1216,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "Tidak dapat mengalokasikan buffer untuk signed conversion" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Tidak dapat menemukan GCLK yang kosong" @@ -1709,7 +1709,7 @@ msgstr "" msgid "empty" msgstr "" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "heap kosong" @@ -2586,6 +2586,11 @@ msgstr "" msgid "unsupported types for %q: '%s', '%s'" msgstr "" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index a0ea2aea3..758ee841e 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-10 10:09-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -2539,6 +2539,11 @@ msgstr "" msgid "unsupported types for %q: '%s', '%s'" msgstr "" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/de_DE.po b/locale/de_DE.po index 361e5a40e..7b6687a20 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: Pascal Deneaux\n" "Language-Team: Sebastian Plamauer, Pascal Deneaux\n" @@ -54,8 +54,8 @@ msgstr "Der Index %q befindet sich außerhalb der Reihung" msgid "%q indices must be integers, not %s" msgstr "%q Indizes müssen ganze Zahlen sein, nicht %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c msgid "%q must be >= 1" msgstr "%q muss >= 1 sein" @@ -253,8 +253,8 @@ msgstr "Alle sync event Kanäle werden benutzt" msgid "All timers for this pin are in use" msgstr "Alle timer für diesen Pin werden bereits benutzt" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -732,8 +732,8 @@ msgstr "" msgid "Input/output error" msgstr "Eingabe-/Ausgabefehler" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Ungültiger %q pin" @@ -1063,8 +1063,8 @@ msgstr "Abtastrate muss positiv sein" msgid "Sample rate too high. It must be less than %d" msgstr "Abtastrate zu hoch. Wert muss unter %d liegen" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer wird benutzt" @@ -1212,8 +1212,8 @@ msgstr "Der UUID-Wert ist kein str-, int- oder Byte-Puffer" msgid "Unable to allocate buffers for signed conversion" msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Konnte keinen freien GCLK finden" @@ -1705,7 +1705,7 @@ msgstr "Division durch Null" msgid "empty" msgstr "leer" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "leerer heap" @@ -2595,6 +2595,11 @@ msgstr "nicht unterstützter Typ für Operator" msgid "unsupported types for %q: '%s', '%s'" msgstr "nicht unterstützte Typen für %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/en_US.po b/locale/en_US.po index c01e06757..67a225561 100644 --- a/locale/en_US.po +++ b/locale/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -52,8 +52,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c msgid "%q must be >= 1" msgstr "" @@ -251,8 +251,8 @@ msgstr "" msgid "All timers for this pin are in use" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -726,8 +726,8 @@ msgstr "" msgid "Input/output error" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "" @@ -1046,8 +1046,8 @@ msgstr "" msgid "Sample rate too high. It must be less than %d" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "" @@ -1183,8 +1183,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "" @@ -1665,7 +1665,7 @@ msgstr "" msgid "empty" msgstr "" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "" @@ -2539,6 +2539,11 @@ msgstr "" msgid "unsupported types for %q: '%s', '%s'" msgstr "" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po index 8ba737e1d..01286bf0c 100644 --- a/locale/en_x_pirate.po +++ b/locale/en_x_pirate.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: @sommersoft, @MrCertainly\n" @@ -54,8 +54,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c msgid "%q must be >= 1" msgstr "" @@ -253,8 +253,8 @@ msgstr "" msgid "All timers for this pin are in use" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -730,8 +730,8 @@ msgstr "" msgid "Input/output error" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Avast! %q pin be invalid" @@ -1050,8 +1050,8 @@ msgstr "" msgid "Sample rate too high. It must be less than %d" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "" @@ -1187,8 +1187,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Arr! No free GCLK be in sight" @@ -1669,7 +1669,7 @@ msgstr "" msgid "empty" msgstr "" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "" @@ -2543,6 +2543,11 @@ msgstr "" msgid "unsupported types for %q: '%s', '%s'" msgstr "" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/es.po b/locale/es.po index 88abe76f4..07825785c 100644 --- a/locale/es.po +++ b/locale/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-08-24 22:56-0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -55,8 +55,8 @@ msgstr "%q indice fuera de rango" msgid "%q indices must be integers, not %s" msgstr "%q indices deben ser enteros, no %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "%q debe ser >= 1" @@ -260,8 +260,8 @@ msgstr "" msgid "All timers for this pin are in use" msgstr "Todos los timers para este pin están siendo utilizados" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -762,8 +762,8 @@ msgstr "Tamaño incorrecto del buffer" msgid "Input/output error" msgstr "error Input/output" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Pin %q inválido" @@ -1096,8 +1096,8 @@ msgstr "Sample rate debe ser positivo" msgid "Sample rate too high. It must be less than %d" msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer está siendo utilizado" @@ -1240,8 +1240,8 @@ msgstr "El valor UUID no es str, int, or buffer byte" msgid "Unable to allocate buffers for signed conversion" msgstr "No se pudieron asignar buffers para la conversión con signo" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "No se pudo encontrar un GCLK libre" @@ -1740,7 +1740,7 @@ msgstr "división por cero" msgid "empty" msgstr "vacío" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "heap vacío" @@ -2629,6 +2629,11 @@ msgstr "tipo de operador no soportado" msgid "unsupported types for %q: '%s', '%s'" msgstr "tipos no soportados para %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "value_count debe ser > 0" diff --git a/locale/fil.po b/locale/fil.po index 27333c168..bc9b80e78 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-12-20 22:15-0800\n" "Last-Translator: Timothy <me@timothygarcia.ca>\n" "Language-Team: fil\n" @@ -52,8 +52,8 @@ msgstr "%q indeks wala sa sakop" msgid "%q indices must be integers, not %s" msgstr "%q indeks ay dapat integers, hindi %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "aarehas na haba dapat ang buffer slices" @@ -255,8 +255,8 @@ msgstr "Lahat ng sync event channels ay ginagamit" msgid "All timers for this pin are in use" msgstr "Lahat ng timers para sa pin na ito ay ginagamit" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -756,8 +756,8 @@ msgstr "" msgid "Input/output error" msgstr "May mali sa Input/Output" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Mali ang %q pin" @@ -1089,8 +1089,8 @@ msgstr "Sample rate ay dapat positibo" msgid "Sample rate too high. It must be less than %d" msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer ginagamit" @@ -1236,8 +1236,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "Hindi ma-allocate ang buffers para sa naka-sign na conversion" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Hindi mahanap ang libreng GCLK" @@ -1739,7 +1739,7 @@ msgstr "dibisyon ng zero" msgid "empty" msgstr "walang laman" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "walang laman ang heap" @@ -2627,6 +2627,11 @@ msgstr "hindi sinusuportahang type para sa operator" msgid "unsupported types for %q: '%s', '%s'" msgstr "hindi sinusuportahang type para sa %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/fr.po b/locale/fr.po index c2b5de2fc..1dec817d5 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2019-04-14 20:05+0100\n" "Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n" "Language-Team: fr\n" @@ -54,8 +54,8 @@ msgstr "index %q hors gamme" msgid "%q indices must be integers, not %s" msgstr "les indices %q doivent être des entiers, pas %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "%d doit être >=1" @@ -258,8 +258,8 @@ msgstr "Tous les canaux d'événements de synchro sont utilisés" msgid "All timers for this pin are in use" msgstr "Tous les timers pour cette broche sont utilisés" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -760,8 +760,8 @@ msgstr "Taille de tampon incorrecte" msgid "Input/output error" msgstr "Erreur d'entrée/sortie" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Broche invalide pour '%q'" @@ -1105,8 +1105,8 @@ msgstr "Le taux d'échantillonage doit être positif" msgid "Sample rate too high. It must be less than %d" msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Sérialiseur en cours d'utilisation" @@ -1259,8 +1259,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "Impossible d'allouer des tampons pour une conversion signée" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Impossible de trouver un GCLK libre" @@ -1772,7 +1772,7 @@ msgstr "division par zéro" msgid "empty" msgstr "vide" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "tas vide" @@ -2669,6 +2669,11 @@ msgstr "type non supporté pour l'opérateur" msgid "unsupported types for %q: '%s', '%s'" msgstr "type non supporté pour %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "'value_count' doit être > 0" diff --git a/locale/it_IT.po b/locale/it_IT.po index 90bbe8c64..42abd3986 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-10-02 16:27+0200\n" "Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n" "Language-Team: \n" @@ -52,8 +52,8 @@ msgstr "indice %q fuori intervallo" msgid "%q indices must be integers, not %s" msgstr "gli indici %q devono essere interi, non %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "slice del buffer devono essere della stessa lunghezza" @@ -254,8 +254,8 @@ msgstr "Tutti i canali di eventi sincronizzati in uso" msgid "All timers for this pin are in use" msgstr "Tutti i timer per questo pin sono in uso" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -755,8 +755,8 @@ msgstr "" msgid "Input/output error" msgstr "Errore input/output" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Pin %q non valido" @@ -1095,8 +1095,8 @@ msgid "Sample rate too high. It must be less than %d" msgstr "" "Frequenza di campionamento troppo alta. Il valore deve essere inferiore a %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer in uso" @@ -1235,8 +1235,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "Ipossibilitato ad allocare buffer per la conversione con segno" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Impossibile trovare un GCLK libero" @@ -1731,7 +1731,7 @@ msgstr "divisione per zero" msgid "empty" msgstr "vuoto" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "heap vuoto" @@ -2625,6 +2625,11 @@ msgstr "tipo non supportato per l'operando" msgid "unsupported types for %q: '%s', '%s'" msgstr "tipi non supportati per %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/pl.po b/locale/pl.po index 9c1dca287..918292a89 100644 --- a/locale/pl.po +++ b/locale/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2019-03-19 18:37-0700\n" "Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n" "Language-Team: pl\n" @@ -53,8 +53,8 @@ msgstr "%q poza zakresem" msgid "%q indices must be integers, not %s" msgstr "%q indeks musi być liczbą całkowitą, a nie %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c msgid "%q must be >= 1" msgstr "%q musi być >= 1" @@ -252,8 +252,8 @@ msgstr "Wszystkie kanały zdarzeń synchronizacji w użyciu" msgid "All timers for this pin are in use" msgstr "Wszystkie timery tej nóżki w użyciu" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -731,8 +731,8 @@ msgstr "Niewłaściwa wielkość bufora" msgid "Input/output error" msgstr "Błąd I/O" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Zła nóżka %q" @@ -1056,8 +1056,8 @@ msgstr "Częstotliwość próbkowania musi być dodatnia" msgid "Sample rate too high. It must be less than %d" msgstr "Zbyt wysoka częstotliwość próbkowania. Musi być mniejsza niż %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializator w użyciu" @@ -1203,8 +1203,8 @@ msgstr "UUID nie jest typu str, int lub bytes" msgid "Unable to allocate buffers for signed conversion" msgstr "Nie udała się alokacja buforów do konwersji ze znakiem" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Brak wolnego GCLK" @@ -1690,7 +1690,7 @@ msgstr "dzielenie przez zero" msgid "empty" msgstr "puste" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "pusta sterta" @@ -2566,6 +2566,11 @@ msgstr "zły typ dla operatora" msgid "unsupported types for %q: '%s', '%s'" msgstr "złe typy dla %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "value_count musi być > 0" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index f7348cf7d..c951cec9b 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2018-10-02 21:14-0000\n" "Last-Translator: \n" "Language-Team: \n" @@ -52,8 +52,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c #, fuzzy msgid "%q must be >= 1" msgstr "buffers devem ser o mesmo tamanho" @@ -254,8 +254,8 @@ msgstr "" msgid "All timers for this pin are in use" msgstr "Todos os temporizadores para este pino estão em uso" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -746,8 +746,8 @@ msgstr "" msgid "Input/output error" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Pino do %q inválido" @@ -1074,8 +1074,8 @@ msgstr "" msgid "Sample rate too high. It must be less than %d" msgstr "Taxa de amostragem muito alta. Deve ser menor que %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Serializer em uso" @@ -1211,8 +1211,8 @@ msgstr "" msgid "Unable to allocate buffers for signed conversion" msgstr "Não é possível alocar buffers para conversão assinada" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Não é possível encontrar GCLK livre" @@ -1697,7 +1697,7 @@ msgstr "divisão por zero" msgid "empty" msgstr "vazio" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "heap vazia" @@ -2576,6 +2576,11 @@ msgstr "" msgid "unsupported types for %q: '%s', '%s'" msgstr "" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "" diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index 6efdc19dc..2d7b5f766 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: circuitpython-cn\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-08 15:23-0700\n" +"POT-Creation-Date: 2019-05-09 01:06-0400\n" "PO-Revision-Date: 2019-04-13 10:10-0700\n" "Last-Translator: hexthat\n" "Language-Team: Chinese Hanyu Pinyin\n" @@ -54,8 +54,8 @@ msgstr "%q suǒyǐn chāochū fànwéi" msgid "%q indices must be integers, not %s" msgstr "%q suǒyǐn bìxū shì zhěngshù, ér bùshì %s" -#: shared-bindings/bleio/CharacteristicBuffer.c #: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c msgid "%q must be >= 1" msgstr "%q bìxū dàyú huò děngyú 1" @@ -253,8 +253,8 @@ msgstr "Suǒyǒu tóngbù shìjiàn píndào shǐyòng" msgid "All timers for this pin are in use" msgstr "Cǐ yǐn jiǎo de suǒyǒu jìshí qì zhèngzài shǐyòng" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #: ports/atmel-samd/common-hal/pulseio/PulseOut.c #: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c #: shared-module/_pew/PewPew.c @@ -732,8 +732,8 @@ msgstr "Huǎnchōng qū dàxiǎo bù zhèngquè" msgid "Input/output error" msgstr "Shūrù/shūchū cuòwù" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Invalid %q pin" msgstr "Wúxiào de %q yǐn jiǎo" @@ -1061,8 +1061,8 @@ msgstr "Cǎiyàng lǜ bìxū wèi zhèng shù" msgid "Sample rate too high. It must be less than %d" msgstr "Cǎiyàng lǜ tài gāo. Tā bìxū xiǎoyú %d" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Serializer in use" msgstr "Xùliè huà yǐjīng shǐyòngguò" @@ -1208,8 +1208,8 @@ msgstr "UUID zhí bùshì str,int huò zì jié huǎnchōng qū" msgid "Unable to allocate buffers for signed conversion" msgstr "Wúfǎ fēnpèi huǎnchōng qū yòng yú qiānmíng zhuǎnhuàn" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Unable to find free GCLK" msgstr "Wúfǎ zhǎodào miǎnfèi de GCLK" @@ -1700,7 +1700,7 @@ msgstr "bèi líng chú" msgid "empty" msgstr "kòngxián" -#: extmod/moduheapq.c extmod/modutimeq.c +#: extmod/modutimeq.c extmod/moduheapq.c msgid "empty heap" msgstr "kōng yīn yīnxiào" @@ -2578,6 +2578,11 @@ msgstr "bù zhīchí de cāozuò zhě lèixíng" msgid "unsupported types for %q: '%s', '%s'" msgstr "bù zhīchí de lèixíng wèi %q: '%s', '%s'" +#: py/objint.c +#, c-format +msgid "value would overflow a %d byte buffer" +msgstr "" + #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" msgstr "zhí jìshù bìxū wèi > 0" diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk index 60638fd19..4405b7a35 100644 --- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk @@ -23,7 +23,7 @@ CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 -CFLAGS_INLINE_LIMIT = 35 +CFLAGS_INLINE_LIMIT = 25 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DotStar diff --git a/py/binary.c b/py/binary.c index 9c3a49e8f..0e4a1d5f6 100644 --- a/py/binary.c +++ b/py/binary.c @@ -304,15 +304,18 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte ** break; } #endif - default: + default: { + bool signed_type = is_signed(val_type); #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE if (MP_OBJ_IS_TYPE(val_in, &mp_type_int)) { + mp_obj_int_buffer_overflow_check(val_in, size, signed_type); mp_obj_int_to_bytes_impl(val_in, struct_type == '>', size, p); return; } else #endif { val = mp_obj_get_int(val_in); + mp_obj_int_buffer_overflow_check(val_in, size, signed_type); // zero/sign extend if needed if (BYTES_PER_WORD < 8 && size > sizeof(val)) { int c = (is_signed(val_type) && (mp_int_t)val < 0) ? 0xff : 0x00; @@ -322,6 +325,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte ** } } } + } } mp_binary_set_int(MIN((size_t)size, sizeof(val)), struct_type == '>', p, val); @@ -343,16 +347,22 @@ void mp_binary_set_val_array(char typecode, void *p, mp_uint_t index, mp_obj_t v ((mp_obj_t*)p)[index] = val_in; break; #endif - default: + default: { + size_t size = mp_binary_get_size('@', typecode, NULL); + bool signed_type = is_signed(typecode); + #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE if (MP_OBJ_IS_TYPE(val_in, &mp_type_int)) { - size_t size = mp_binary_get_size('@', typecode, NULL); + mp_obj_int_buffer_overflow_check(val_in, size, signed_type); mp_obj_int_to_bytes_impl(val_in, MP_ENDIANNESS_BIG, size, (uint8_t*)p + index * size); return; } #endif - mp_binary_set_val_array_from_int(typecode, p, index, mp_obj_get_int(val_in)); + mp_int_t val = mp_obj_get_int(val_in); + mp_obj_int_buffer_overflow_check(val_in, size, signed_type); + mp_binary_set_val_array_from_int(typecode, p, index, val); + } } } diff --git a/py/objint.c b/py/objint.c index fd746d331..80f6dfe55 100644 --- a/py/objint.c +++ b/py/objint.c @@ -300,6 +300,38 @@ char *mp_obj_int_formatted(char **buf, size_t *buf_size, size_t *fmt_size, mp_co return b; } +void mp_obj_int_buffer_overflow_check(mp_obj_t self_in, size_t nbytes, bool is_signed) +{ + if (is_signed) { + // self must be < 2**(bits - 1) + mp_obj_t edge = mp_binary_op(MP_BINARY_OP_INPLACE_LSHIFT, + mp_obj_new_int(1), + mp_obj_new_int(nbytes * 8 - 1)); + + if (mp_binary_op(MP_BINARY_OP_LESS, self_in, edge) == mp_const_true) { + // and >= -2**(bits - 1) + edge = mp_unary_op(MP_UNARY_OP_NEGATIVE, edge); + if (mp_binary_op(MP_BINARY_OP_MORE_EQUAL, self_in, edge) == mp_const_true) { + return; + } + } + } else { + // self must be >= 0 + if (mp_obj_int_sign(self_in) >= 0) { + // and < 2**(bits) + mp_obj_t edge = mp_binary_op(MP_BINARY_OP_INPLACE_LSHIFT, + mp_obj_new_int(1), + mp_obj_new_int(nbytes * 8)); + + if (mp_binary_op(MP_BINARY_OP_LESS, self_in, edge) == mp_const_true) { + return; + } + } + } + + mp_raise_OverflowError_varg(translate("value would overflow a %d byte buffer"), nbytes); +} + #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_NONE int mp_obj_int_sign(mp_obj_t self_in) { @@ -435,6 +467,8 @@ STATIC mp_obj_t int_to_bytes(size_t n_args, const mp_obj_t *args) { byte *data = (byte*)vstr.buf; memset(data, 0, len); + mp_obj_int_buffer_overflow_check(args[0], len, false); + #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE if (!MP_OBJ_IS_SMALL_INT(args[0])) { mp_obj_int_to_bytes_impl(args[0], big_endian, len, data); diff --git a/py/objint.h b/py/objint.h index 4b95acde9..654404ac9 100644 --- a/py/objint.h +++ b/py/objint.h @@ -53,6 +53,7 @@ char *mp_obj_int_formatted(char **buf, size_t *buf_size, size_t *fmt_size, mp_co int base, const char *prefix, char base_char, char comma); char *mp_obj_int_formatted_impl(char **buf, size_t *buf_size, size_t *fmt_size, mp_const_obj_t self_in, int base, const char *prefix, char base_char, char comma); +void mp_obj_int_buffer_overflow_check(mp_obj_t self_in, size_t nbytes, bool is_signed); mp_int_t mp_obj_int_hash(mp_obj_t self_in); mp_obj_t mp_obj_int_from_bytes_impl(bool big_endian, size_t len, const byte *buf); void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf); diff --git a/py/runtime.c b/py/runtime.c index 1a75a3870..9968f26e0 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1598,6 +1598,14 @@ NORETURN void mp_raise_NotImplementedError_varg(const compressed_string_t *fmt, nlr_raise(exception); } +NORETURN void mp_raise_OverflowError_varg(const compressed_string_t *fmt, ...) { + va_list argptr; + va_start(argptr,fmt); + mp_obj_t exception = mp_obj_new_exception_msg_vlist(&mp_type_OverflowError, fmt, argptr); + va_end(argptr); + nlr_raise(exception); +} + NORETURN void mp_raise_MpyError(const compressed_string_t *msg) { mp_raise_msg(&mp_type_MpyError, msg); } diff --git a/py/runtime.h b/py/runtime.h index c5a94b0b1..e8398cf0e 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -163,6 +163,7 @@ NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg); NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); NORETURN void mp_raise_NotImplementedError_varg(const compressed_string_t *fmt, ...); +NORETURN void mp_raise_OverflowError_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_MpyError(const compressed_string_t *msg); NORETURN void mp_raise_recursion_depth(void); diff --git a/tests/basics/array_overflow.py b/tests/basics/array_overflow.py new file mode 100644 index 000000000..ba3eb7f06 --- /dev/null +++ b/tests/basics/array_overflow.py @@ -0,0 +1,35 @@ +import skip_if +skip_if.no_bigint() + +try: + from array import array +except ImportError: + print("SKIP") + raise SystemExit + +def test_array_overflow(typecode, val): + try: + print(array(typecode, [val])) + except OverflowError: + print('OverflowError') + +# small int -1 +test_array_overflow('Q', -1) +test_array_overflow('L', -1) +test_array_overflow('I', -1) +test_array_overflow('H', -1) +test_array_overflow('B', -1) + +# big int -1 +test_array_overflow('Q', -2**64 // 2**64) +test_array_overflow('L', -2**64 // 2**64) +test_array_overflow('I', -2**64 // 2**64) +test_array_overflow('H', -2**64 // 2**64) +test_array_overflow('B', -2**64 // 2**64) + +# big int 2**63 +test_array_overflow('q', 2**63) +test_array_overflow('l', 2**63) +test_array_overflow('i', 2**63) +test_array_overflow('h', 2**63) +test_array_overflow('b', 2**63) diff --git a/tests/basics/int_bytes.py b/tests/basics/int_bytes.py index 059c16d3f..8c0c9a82f 100644 --- a/tests/basics/int_bytes.py +++ b/tests/basics/int_bytes.py @@ -17,3 +17,15 @@ try: (1).to_bytes(-1, "little") except ValueError: print("ValueError") + +# too small buffer should raise an error +try: + (256).to_bytes(1, "little") +except OverflowError: + print("OverflowError") + +# negative numbers should raise an error +try: + (-256).to_bytes(2, "little") +except OverflowError: + print("OverflowError") diff --git a/tests/basics/int_bytes_intbig.py b/tests/basics/int_bytes_intbig.py index ce6fec40a..b19c8ae53 100644 --- a/tests/basics/int_bytes_intbig.py +++ b/tests/basics/int_bytes_intbig.py @@ -15,3 +15,15 @@ print(ib.to_bytes(20, "big")) # check that extra zero bytes don't change the internal int value print(int.from_bytes(b + bytes(10), "little") == int.from_bytes(b, "little")) + +# too small buffer should raise an error +try: + (2**64).to_bytes(8, "little") +except OverflowError: + print("OverflowError") + +# negative numbers should raise an error +try: + (-2**64).to_bytes(9, "little") +except OverflowError: + print("OverflowError") diff --git a/tests/basics/struct_overflow.py b/tests/basics/struct_overflow.py new file mode 100644 index 000000000..aee0c6b9d --- /dev/null +++ b/tests/basics/struct_overflow.py @@ -0,0 +1,47 @@ +import skip_if +skip_if.no_bigint() + +try: + import ustruct as struct +except: + try: + import struct + except ImportError: + print("SKIP") + raise SystemExit + +def test_struct_overflow(typecode, val): + try: + print(struct.pack(typecode, val)) + except OverflowError: + print('OverflowError') + except struct.error: + print('OverflowError') + +# small int -1 +test_struct_overflow('>Q', -1) +test_struct_overflow('>L', -1) +test_struct_overflow('>I', -1) +test_struct_overflow('>H', -1) +test_struct_overflow('>B', -1) + +# big int -1 +test_struct_overflow('>Q', -2**64 // 2**64) +test_struct_overflow('>L', -2**64 // 2**64) +test_struct_overflow('>I', -2**64 // 2**64) +test_struct_overflow('>H', -2**64 // 2**64) +test_struct_overflow('>B', -2**64 // 2**64) + +# possibly small ints +test_struct_overflow('>q', 2**63) +test_struct_overflow('>l', 2**31) +test_struct_overflow('>i', 2**31) +test_struct_overflow('>h', 2**15) +test_struct_overflow('>b', 2**7) + +# definitely big ints +test_struct_overflow('>q', 2**64 // 2**1) +test_struct_overflow('>l', 2**64 // 2**33) +test_struct_overflow('>i', 2**64 // 2**33) +test_struct_overflow('>h', 2**64 // 2**49) +test_struct_overflow('>b', 2**64 // 2**57) |
