[devel] memcpy глючит (или я не умею его готовить)
Paul Wolneykien
manowar на altlinux.org
Чт Фев 21 16:17:07 MSK 2019
Коллеги, прошу помощи разбором одной проблемы. Предполагаю, что это
какая-то очевидная ошибка: то ли я действительно не умею готовить
memcpy(), то ли где-то в программе есть ошибки при работе с памятью,
которые влияют косвенно (может в данном случае такое быть?).
Итак, у меня есть вот такой код¹
> 1460 if (_data.size % 2 && _data.data[8] == 0x04) {
> 1461 // Uncompressed point (the first 8 bytes is the UKM)
> 1462 memcpy (_data.data + 8, _data.data + 9, _data.size - 9);
> 1463 _data.size--;
> 1464 }
после выполнения которого на Сизифе, я получаю копию массива данных за
исключением 9-го (по счёту с 1) байта. Как и планировалось. Однако, если
тот же самый бинарь запустить на машинке с p8, то получается неожиданный
и странный эффект: 57-й байт заменяется копией 58-го. Вот
как это выглядит (см. конец строки 0x4cc050 – начало строки 0x4cc058 во
втором дампе):
> (gdb) x/73ubfx _data.data
> 0x4cc020: 0xdd 0x0a 0x35 0x80 0x51 0x13 0xed 0xdb
> 0x4cc028: 0x04 0xd6 0x9b 0xa0 0x15 0x3b 0xa2 0x72
> 0x4cc030: 0x98 0x72 0xd0 0x2a 0x64 0x45 0x79 0x05
> 0x4cc038: 0x4e 0x0f 0x74 0x4e 0x70 0x07 0xa9 0x4f
> 0x4cc040: 0x87 0x53 0xb4 0x55 0xd3 0xc6 0x81 0x48
> 0x4cc048: 0x90 0xbd 0xa1 0xff 0x28 0x7e 0x97 0x41
> 0x4cc050: 0x2a 0x6e 0xbf 0x5e 0xfc 0xa0 0xf4 0x2b
> 0x4cc058: 0xcd 0x47 0x64 0x36 0x46 0xb0 0x02 0x7b
> 0x4cc060: 0x11 0x03 0xe6 0x9c 0xed 0x94 0x43 0x50
> 0x4cc068: 0xdf
>
> (gdb) n
> 1463
>
> (gdb) x/73ubfx _data.data
> 0x4cc020: 0xdd 0x0a 0x35 0x80 0x51 0x13 0xed 0xdb
> 0x4cc028: 0xd6 0x9b 0xa0 0x15 0x3b 0xa2 0x72 0x98
> 0x4cc030: 0x72 0xd0 0x2a 0x64 0x45 0x79 0x05 0x4e
> 0x4cc038: 0x0f 0x74 0x4e 0x70 0x07 0xa9 0x4f 0x87
> 0x4cc040: 0x53 0xb4 0x55 0xd3 0xc6 0x81 0x48 0x90
> 0x4cc048: 0xbd 0xa1 0xff 0x28 0x7e 0x97 0x41 0x2a
> 0x4cc050: 0x6e 0xbf 0x5e 0xfc 0xa0 0xf4 0x2b 0x47
> 0x4cc058: 0x47 0x64 0x36 0x46 0xb0 0x02 0x7b 0x11
> 0x4cc060: 0x03 0xe6 0x9c 0xed 0x94 0x43 0x50 0xdf
> 0x4cc068: 0xdf
На других входных данных пока не пробовал. Зато пробовал на разных
машинах с Сизифом и p8 — воспроизводится стабильно. Причём, один из
Сизифов не самый новый. Однако на Сизифах работает, а на p8 — получаю
паразитную копию того самого 57-го байта. Архитектуры везде x86_64.
---
¹
http://git.altlinux.org/gears/g/gnupg-pkcs11-scd.git?p=gnupg-pkcs11-scd.git;a=blob;f=gnupg-pkcs11-scd/gnupg-pkcs11-scd/command.c;h=6fd39a8ef70dede06e54c49ab86bdfc2c01e74c3;hb=6bda8fd5e3b3862edca3a38ac62c01477b6ab909#l1460
Подробная информация о списке рассылки Devel