Π― Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠΎΠ±ΡΠ°ΡΡ stlink 1.6.1 Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ GCC 11. Fedora GNU / Linux Rawhide.
ΠΡΠΈΠ±ΠΊΠΈ Π±ΡΠ²Π°ΡΡ:
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: error: 'stlink_open_usb' accessing 64 bytes in a region of size 28 [-Werror=stringop-overflow=]
90 | sl = stlink_open_usb(st->logging_level, st->reset, serialnumber, 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c: In function 'serve':
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: note: referencing argument 3 of type 'char *'
In file included from /builddir/build/BUILD/stlink-1.6.1/include/stlink.h:297,
from /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:27:
/builddir/build/BUILD/stlink-1.6.1/src/usb.h:71:15: note: in a call to function 'stlink_open_usb'
71 | stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_MAX_SIZE], int freq);
| ^~~~~~~~~~~~~~~
In function 'do_connect',
inlined from 'do_connect' at /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:87:18,
inlined from 'main' at /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:212:10:
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: error: 'stlink_open_usb' accessing 64 bytes in a region of size 28 [-Werror=stringop-overflow=]
90 | sl = stlink_open_usb(st->logging_level, st->reset, serialnumber, 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΠΌΠ½Π΅ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ.
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ STLINK_SERIAL_MAX_SIZE
define Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² 28
?
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ src/st-util/gdb-server.c
:
static char serialnumber[28] = {0};
ΠΊ
static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ Π²ΠΈΠ΄Π΅ΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² Π°ΠΏΡΡΡΠΈΠΌΠ΅.
@Vascom Π― ΡΠΎΠΆΠ΅. ΠΠΎ ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ Π² Π°ΠΏΡΡΡΠΈΠΌΠ΅, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ.
ps ΠΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ ΠΏΠΎ ΡΠ°Π±Π»ΠΎΠ½Ρ. @ Nightwalker-87 ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π°Π»ΠΈΡΡ Π΅Π³ΠΎ. Π‘ΠΌ. β 906
ΠΠ°, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π¨Π°Π±Π»ΠΎΠ½ Π½Π΅ Π·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠ΅ΠΉ.
Π¨Π°Π±Π»ΠΎΠ½ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅. Π’Π°ΠΊ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΎΠ± ΡΡΠΎΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π·.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ
src/st-util/gdb-server.c
:static char serialnumber[28] = {0};
ΠΊ
static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};
Π― ΠΏΠΎΡΡΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΡΡΠΎ (ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ gcc-11 Ρ Fedora). ΠΠ΅Π½Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΠ» ΡΡΠΎΡ ΡΠΈΠΊΠ» Π² gdb-server.c:
for (size_t k = 0; j> = 0 && k <sizeof (ΡΠ΅ΡΠΈΠΉΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ); ++ k, j - = 2) {
char buffer [3] = {0};
memcpy (Π±ΡΡΠ΅Ρ, optarg + j, 2);
ΡΠ΅ΡΠΈΠΉΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ [Π΄Π»ΠΈΠ½Π° - k] = (uint8_t) strtol (buffer, NULL, 16);
ΠΠ° ΡΡΠΎ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° "ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ°". ΠΠ΅ Π·Π½Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠΎΠ΄Π° Π² ΡΠ΅Π»ΠΎΠΌ, Ρ Π½Π΅ ΡΡΠ²ΡΡΠ²ΠΎΠ²Π°Π» ΡΠ΅Π±Ρ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΠΎ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Β«ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ°Β».
Π ΡΡΠΎΠ±Ρ Π΄Π°ΡΡ Π»ΡΠ΄ΡΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΡΠΎΡΠΈΠΈ. Π gcc-11 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ββΠ΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ Π²ΡΡ ΠΎΠ΄ΠΎΠ² Π·Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΠΏΡΠ΅Π΄Π΅Π»Ρ Π΄Π»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠ°ΠΊ ΠΌΠ°ΡΡΠΈΠ² Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ, ΡΠΎ GCC ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ Π½Π° Π²Π΅ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ»Π°ΡΡΡΡ.
stlink_open_usb ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠ°ΠΊ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΈΠ· 64 Π±Π°ΠΉΡΠΎΠ², Π½ΠΎ Β«ΡΠ΅ΡΠΈΠΉΠ½ΡΠΉ Π½ΠΎΠΌΠ΅ΡΒ» ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ΅Π³ΠΎ 28 Π±Π°ΠΉΡΠΎΠ², ΠΈ GCC, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ stlink_open_usb ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΉΡΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Β«ΡΠ΅ΡΠΈΠΉΠ½ΡΠΉ Π½ΠΎΠΌΠ΅ΡΒ».