Skip to content

Commit f2713af

Browse files
authored
Merge pull request #5896 from dhalbert/open-modes-check
Validate open() mode
2 parents dab35f7 + fed5227 commit f2713af

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

extmod/vfs_fat_file.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,39 +139,58 @@ STATIC const mp_arg_t file_open_args[] = {
139139
STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_arg_val_t *args) {
140140
int mode = 0;
141141
const char *mode_s = mp_obj_str_get_str(args[1].u_obj);
142-
// TODO make sure only one of r, w, x, a, and b, t are specified
142+
uint32_t rwxa_count = 0;
143+
uint32_t bt_count = 0;
144+
uint32_t plus_count = 0;
145+
bool bad_mode = false;
143146
while (*mode_s) {
144147
switch (*mode_s++) {
145148
case 'r':
146149
mode |= FA_READ;
150+
rwxa_count++;
147151
break;
148152
case 'w':
149153
mode |= FA_WRITE | FA_CREATE_ALWAYS;
154+
rwxa_count++;
150155
break;
151156
case 'x':
152157
mode |= FA_WRITE | FA_CREATE_NEW;
158+
rwxa_count++;
153159
break;
154160
case 'a':
155161
mode |= FA_WRITE | FA_OPEN_ALWAYS;
162+
rwxa_count++;
156163
break;
157164
case '+':
158165
mode |= FA_READ | FA_WRITE;
166+
plus_count++;
159167
break;
160168
#if MICROPY_PY_IO_FILEIO
161169
case 'b':
170+
bt_count++;
162171
type = &mp_type_vfs_fat_fileio;
163172
break;
164173
#endif
165174
case 't':
175+
bt_count++;
166176
type = &mp_type_vfs_fat_textio;
167177
break;
178+
default:
179+
bad_mode = true;
180+
break;
168181
}
169182
}
183+
184+
if (rwxa_count != 1 || plus_count > 1 || bt_count > 1 || bad_mode) {
185+
mp_raise_ValueError(translate("Invalid mode"));
186+
}
187+
170188
assert(vfs != NULL);
171189
if ((mode & FA_WRITE) != 0 && !filesystem_is_writable_by_python(vfs)) {
172190
mp_raise_OSError(MP_EROFS);
173191
}
174192

193+
175194
pyb_file_obj_t *o = m_new_obj_with_finaliser(pyb_file_obj_t);
176195
o->base.type = type;
177196

locale/circuitpython.pot

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,10 @@ msgstr ""
13701370
msgid "Invalid memory access."
13711371
msgstr ""
13721372

1373+
#: extmod/vfs_fat_file.c
1374+
msgid "Invalid mode"
1375+
msgstr ""
1376+
13731377
#: ports/espressif/common-hal/wifi/Radio.c
13741378
msgid "Invalid multicast MAC address"
13751379
msgstr ""
@@ -3992,22 +3996,26 @@ msgstr ""
39923996
msgid "pow() with 3 arguments requires integers"
39933997
msgstr ""
39943998

3999+
#: ports/espressif/boards/adafruit_esp32s2_camera/mpconfigboard.h
39954000
#: ports/espressif/boards/adafruit_feather_esp32s2/mpconfigboard.h
39964001
#: ports/espressif/boards/adafruit_feather_esp32s2_tft/mpconfigboard.h
39974002
#: ports/espressif/boards/adafruit_feather_esp32s2_tftback_nopsram/mpconfigboard.h
39984003
#: ports/espressif/boards/adafruit_funhouse/mpconfigboard.h
39994004
#: ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
40004005
#: ports/espressif/boards/adafruit_metro_esp32s2/mpconfigboard.h
40014006
#: ports/espressif/boards/adafruit_qtpy_esp32s2/mpconfigboard.h
4007+
#: ports/espressif/boards/adafruit_qtpy_esp32s3_nopsram/mpconfigboard.h
40024008
#: ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.h
40034009
#: ports/espressif/boards/ai_thinker_esp_12k_nodemcu/mpconfigboard.h
40044010
#: ports/espressif/boards/artisense_rd00/mpconfigboard.h
40054011
#: ports/espressif/boards/atmegazero_esp32s2/mpconfigboard.h
40064012
#: ports/espressif/boards/crumpspace_crumps2/mpconfigboard.h
40074013
#: ports/espressif/boards/electroniccats_bastwifi/mpconfigboard.h
4014+
#: ports/espressif/boards/espressif_esp32c3_devkitm_1_n4/mpconfigboard.h
40084015
#: ports/espressif/boards/espressif_esp32s3_box/mpconfigboard.h
4009-
#: ports/espressif/boards/espressif_esp32s3_devkitc_1/mpconfigboard.h
4010-
#: ports/espressif/boards/espressif_esp32s3_devkitc_1_nopsram/mpconfigboard.h
4016+
#: ports/espressif/boards/espressif_esp32s3_devkitc_1_n8/mpconfigboard.h
4017+
#: ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2/mpconfigboard.h
4018+
#: ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r8/mpconfigboard.h
40114019
#: ports/espressif/boards/espressif_hmi_devkit_1/mpconfigboard.h
40124020
#: ports/espressif/boards/espressif_kaluga_1.3/mpconfigboard.h
40134021
#: ports/espressif/boards/espressif_kaluga_1/mpconfigboard.h

ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ LONGINT_IMPL = MPZ
1313

1414
CIRCUITPY_KEYPAD = 0
1515
CIRCUITPY_ONEWIREIO = 0
16+
CIRCUITPY_USB_MIDI = 0
1617

1718
CIRCUITPY_BITBANG_APA102 = 1

0 commit comments

Comments
 (0)