LINUX.ORG.RU

Помогите отловить segfault

 , , ,


0

1

Итак есть говно утилитки для работы с прошивкой сетевого девайса на базе Atheros-MIPS.

fwsplit ловит ошибку сегментирования. В глаза сразу бросается

f==NULL 
вместо
if(!f)

Исходники файлов для изучения и бинарники (amd64) с самим файлом прошивки для тестирования прилагаются

P.S. Если причина не в говнокоде, значит разрабы изменили формат прошивки.

Как то так. cast emulek Eddy_Em

★★★★★

Последнее исправление: Twissel (всего исправлений: 4)
Ответ на: комментарий от Twissel

Дык, от этого ничего не поменяется, т.к. ты поменял дефайн в исходнике, формирующем этот бинарь! А бинарь-то так и остался бажным!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Twissel

Итак, если взять строку 156 и заменить на

	for (i = 0; i < fw->part_count - 1; ++i) {
, аналогично заменить строку 172 (номера могут не совпадать, ищи по fw->part_count, то создаются файлы и ничего не падает.

Но: я не гарантирую, что там где-то других косяков нет. Ведь если изначально тебе дали бажный бинарь, не факт, что там где-то еще каких-нибудь косяков не наляпали.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

И еще: я сделал это на x86_64, если будешь на мипсе выполнять, то могут еще какие-нибудь косяки вылезти. И исходники тут ни при чем! Бажный бинарь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ага, я уже допер! И первое сделал по Вашей прошлой подсказке.

не факт, что там где-то еще каких-нибудь косяков не наляпали.

Не знаю, вроде как суровые зауральные мужики умудрялись даже сегфолтящимся mkfwimage собирать рабочие образы :-D

Еще раз Вам моя огромная благодарность!

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Нее, для меня в данном случае mips read only/flash once.

Рулить uboot'ом там можно только припаявшись к плате - а у меня она всего одна ;-)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Не за что. Но лучше бы оригинальный бинарь допилить до человеческого вида. Хотя бы распарсить и собрать заново, без ошибок.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Twissel
--- fwsplit.c.orig      2015-03-09 21:21:44.799598223 +0100
+++ fwsplit.c   2015-03-09 21:29:02.014809008 +0100
@@ -107,6 +107,7 @@
                                WARN("Invalid '%s' CRC (claims: %u, but is %u)\n",
                                                fwp->header->name, fwp->signature->crc, crc);
                        }
+                       ++i;
                }

                p = (part_t*)((unsigned char*)p + sizeof(part_t) +
@@ -116,7 +117,6 @@
                if (((unsigned char*)p - base) >= size) {
                        return -3;
                }
-               ++i;
        }
        fw->part_count = i;

Это исправляет кол-во «PART». — Их 3. Последняя (4-я) — «EXEC» — надо ли его тебе экстрагировать — я не знаю. Могу попробовать исправить.

Firmware file: 'XM.bin'
DEBUG: Calculated CRC: 0x9C0C429B, expected: 0x9C0C429B
Firmware version: 'XM.ar7240.v5.5.8.20991.140205.1824'
DEBUG: Partition (PART): u-boot [0]
DEBUG:   Partition size: 0x40000
DEBUG:   Data size: 184880
DEBUG: Partition (PART): kernel [1]
DEBUG:   Partition size: 0x100000
DEBUG:   Data size: 1047713
DEBUG: Partition (PART): rootfs [2]
DEBUG:   Partition size: 0x660000
DEBUG:   Data size: 5525504
DEBUG: Partition (EXEC): script [1]
DEBUG:   Partition size: 0x6BD5
DEBUG:   Data size: 27605
Creating descriptor file:
        XM.ar7240.v5.5.8.20991.140205.1824.txt
Creating partition data files: 
        XM.ar7240.v5.5.8.20991.140205.1824.u-boot
        XM.ar7240.v5.5.8.20991.140205.1824.kernel
        XM.ar7240.v5.5.8.20991.140205.1824.rootfs
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

А ubnt-mkfwimage его соберет нормально или там опять надо править im->part_count?

З.Ы. Ну, вроде нет же, там я сам могу задать количество разделов для сборки.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от beastie

Вынимает всё:

--- fwsplit.c.orig      2015-03-09 21:21:44.799598223 +0100
+++ fwsplit.c   2015-03-09 21:43:55.405166019 +0100
@@ -84,29 +84,26 @@
        INFO("Firmware version: '%s'\n", fw->version);
 
        p = (part_t*)(base + sizeof(header_t));
-       i = 0;
-       while (strncmp(p->magic, MAGIC_END, MAGIC_LENGTH) != 0) {
+       for (i = 0; strncmp(p->magic, MAGIC_END, MAGIC_LENGTH) != 0 && i < MAX_PARTS; i++) {
                DEBUG("Partition (%c%c%c%c): %s [%u]\n",
                                p->magic[0], p->magic[1], p->magic[2], p->magic[3],
                                p->name, ntohl(p->index));
                DEBUG("  Partition size: 0x%X\n", ntohl(p->part_size));
                DEBUG("  Data size: %u\n", ntohl(p->data_size));
 
-               if ((strncmp(p->magic, MAGIC_PART, MAGIC_LENGTH) == 0) && (i < MAX_PARTS)) {
-                       fw_part_t* fwp = &fw->parts[i];
+               fw_part_t* fwp = &fw->parts[i];
 
-                       fwp->header = p;
-                       fwp->data = (unsigned char*)p + sizeof(part_t);
-                       fwp->data_size = ntohl(p->data_size); 
-                       fwp->signature = 
-                               (part_crc_t*)(fwp->data + fwp->data_size);
-
-                       crc = htonl(crc32(0L, (unsigned char*)p, 
-                                         fwp->data_size + sizeof(part_t)));
-                       if (crc != fwp->signature->crc) {
-                               WARN("Invalid '%s' CRC (claims: %u, but is %u)\n", 
-                                               fwp->header->name, fwp->signature->crc, crc);
-                       }
+               fwp->header = p;
+               fwp->data = (unsigned char*)p + sizeof(part_t);
+               fwp->data_size = ntohl(p->data_size); 
+               fwp->signature = 
+                       (part_crc_t*)(fwp->data + fwp->data_size);
+
+               crc = htonl(crc32(0L, (unsigned char*)p, 
+                                 fwp->data_size + sizeof(part_t)));
+               if (crc != fwp->signature->crc) {
+                       WARN("Invalid '%s' CRC (claims: %u, but is %u)\n", 
+                                       fwp->header->name, fwp->signature->crc, crc);
                }
 
                p = (part_t*)((unsigned char*)p + sizeof(part_t) + 
@@ -116,7 +113,6 @@
                if (((unsigned char*)p - base) >= size) {
                        return -3;
                }
-               ++i;
        }
        fw->part_count = i;
 
beastie ★★★★★
()
Ответ на: комментарий от Twissel

По идее, соберет. Надо код читать внимательно.

Но beastie ниже уже нашел косяк в бинаре.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от beastie

Попробуйте, возможно, это просто «заглушка»?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от beastie

Это, похоже что, ok.

./ubnt-mkfwimage -o test.bin -i XM.ar7240.v5.5.8.20991.140205.1824.txt 
Firmware version: 'UNKNOWN'
Output file: 'test.bin'
Part count: 4
     u-boot:   184880 bytes (free:    77264)
     kernel:  1047713 bytes (free:      863)
     rootfs:  5525504 bytes (free:  1159168)
     script:    27605 bytes (free:        0)

beastie ★★★★★
()
Ответ на: комментарий от Twissel

Незачто. Вроде теперь разбирает-собирает. Если не считать разный magic в начале (первые 4 байта), разница после пере-сбора только в поледних 12-и байт (скорей всего чек-сумма), размер сходится. Глубже не копал.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Пора спать)

Туплю

patching file fwsplit.c
Hunk #1 FAILED at 84.
Hunk #2 FAILED at 116.
2 out of 2 hunks FAILED -- saving rejects to file fwsplit.c.rej

patch -i «имя файла»

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.