LINUX.ORG.RU

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

 , , ,


0

1

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

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

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

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

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

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

★★★★★

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

В глаза сразу бросается
f==NULL
вместо
if(!f)

Вы нашли разницу?

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

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)

Лол, валяюсь с постановки вопроса просто. Мало того, что без железки, как я понимаю, разобраться в проблеме будет сложно, так ещё и нет бектрейса, не понятно, что за «147 строчка» такая + какие то доводы левые про NULL. Всё в традициях дебилолора

Что ж, попробую конечно, на приложенное барахло глянуть.

lisper-pipisper
()

Если segfault после INFO, то покажи хоть, что в filename и prefix

lisper-pipisper
()

Не совсем понятно a) где крашится программа (на десктопе/сервере или на устройстве под управлением openwrt). b) Где строчка №147 ? с) Сборка дебаг или релиз ?

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

а) Программа крашиться на десктопе, т.к. прошивка разбирается на составляющие на ПК.

б) В файле fwsplit.c

в) Релиз, сегодня 3 часа собирал этот «тулчейн» от разработчиков железки.

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

filename берется из начала файла прошивки туда сохраняется разметка разделов прошивки XM.ar7240.v5.5.8.20991.140205.1824.txt

prefix вроде как цифровая версия прошивки, но не уверен.

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

Разница стилистическая :-)

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

Ога, а собрать с -g для начала никак? )

Лучше покажи, что у тебя в момент сегфолта в filename и prefix (покажи первые байты до \0, убедись, что там всё, что нужно, и что \0 там есть). Сложно судить о багах, не имея ни нормальных бинарников, ни, собственно, твоего железа

//1234

lisper-pipisper
()
Ответ на: комментарий от Twissel

в) Релиз, сегодня 3 часа собирал этот «тулчейн» от разработчиков железки.

Если релиз то то что тебе говорит gdb не всегда соотвецтвует действительности (строчка может быть обсалютно другой из за оптимизации). Если есть возможность сразу все пересоберите в дебаге (-g -O0) возможно стектрейс будет совсем другим. И можно запустить под valgrind чтоб всякие переполнения/ошибки адресации убрать ...

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

может у вас в prefix нету завершающего 0 и сегфолт происходит там (когда snprintf пытается отыскать конец строчки prefix)? а в стеке вы видете строчку 147 потомучто собрано с оптимизацией (такое бывает часто).

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

Тогда ты как будто что-то не договариваешь.

Сделай в gdb x/50xb filename, например, сразу после краша. Только собери сначала с -O0 -g

INFO это обычный fprintf. Упасть он может только из-за левого filename

lisper-pipisper
()
Ответ на: комментарий от zaz

пересоберите в дебаге

Дык систему сборки эту вижу первый раз в жизни, в мейкфайлах путаюсь...

Кому интересно ссылка на тулчейн.

Повторюсь, железо тут не причем то, что сегфолтиться собирается по ПКшную архитектуру.

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

я ожидал чего то типа

1) gdb ~/Загрузки/dump
2) bt
3) на строчке 35 видишь вызов какая ф-ция на стеке.

причём в п1. хотелось бы какой именно файл из предоставленных топикстартером запускать чтобы поглядеть и на что глядеть

AndreyKl ★★★★★
()

Ты куда-нибудь в нормальное место не мог исходники выложить? Хотя бы на pastebin, если нелады с VCS.

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

Просто bt. И он пишет do_fwsplit(). Also info reg и objdump -d filename дадут место, где вышла ошибка. К сожалению, больше ничего сказать не могу, даже с отладочными символами он не хочет ничего показывать, видимо из-за разных версий библиотек (линукс же, ага, у каждого свой огород). Бинарь называется fwsplit.

Работка явно неблагодарная. Лучше бы ТС сам вывел, что показывает bt, list, далее по обстоятельствам. Если у ТС'а есть гмыло, могу в близжайший час поговорить с ним через встроенный жаббер, потом я спать пойду

lisper-pipisper
()
Ответ на: комментарий от lisper-pipisper

Иди в жопу!

Я насчет того, что не собираюсь качать какой-то странный архив и распаковывать его, чтобы посмотреть 3 строчки кода!

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

что не собираюсь качать какой-то странный архив и распаковывать его, чтобы посмотреть 3 строчки кода!

Ну и никто не собрался бы, просьба о помощи составлена как-то абы как. С другой стороны, почему бы и не помочь человеку?

lisper-pipisper
()
Ответ на: комментарий от lisper-pipisper

Аналогично. Завтра рано на работу.

Если что, на неделе сам поработаю, скину сюда выхлопы.

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

А, ну ок. Удачи. Смотри bt, list и делай print или x с аргументами тех комманд/функций, которые будут на строчке, вызвавшей ошибку. Если окажется, что значения ошибочные, смотри в какой функции они вычисляются (может, понадобится frame)

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

1. Утилита для сбора прошивки после модификации из 4 сквошей.

2.«Фирмварь» по ссылке в первом сообщении ;-)

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

Ничего не найдено
Возможно, владелец удалил файлы или закрыл к ним доступ.

Я правильно понял, что код не твой, у кого-то он нормально работал, но у тебя падает? Может, проблема в "фирмвари"? Скажем, где-то забыли ввести проверку на реальный размер + преобразование типа ntohl и в итоге — бумц.

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

У меня все нормально открывает, странно.

Код не мой. Падает у всех, кто им пользуется (а это те кто прошивает точки доступа на 5 Ггц).

Просто, если закомментить создание файла с таблицей разделов в прошивке, сами разделы он извлекает, но в конце сегфолтиться.

Это такой обходной путь у ребят, которые его юзают как есть.

Возможно, действительно, проблема в образе.

Сейчас перезалью на Dropbox

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

gdb list

for (i = 0; i < fw->part_count; ++i) {
156                     fwp = &fw->parts[i];
157
158                     fprintf(f, "%s\t\t0x%02X\t0x%08X\t0x%08X\t0x%08X\t0x%08X\t%s.%s\n",
159                             fwp->header->name, 
160                             ntohl(fwp->header->index),
161                             ntohl(fwp->header->baseaddr),
162                             ntohl(fwp->header->part_size),
Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Цикл

for (i = 0; i < fw->part_count; ++i) {
		fwp = &fw->parts[i];

		fprintf(f, "%s\t\t0x%02X\t0x%08X\t0x%08X\t0x%08X\t0x%08X\t%s.%s\n",
			fwp->header->name,
			ntohl(fwp->header->index),
			ntohl(fwp->header->baseaddr),
			ntohl(fwp->header->part_size),
			ntohl(fwp->header->memaddr),
			ntohl(fwp->header->entryaddr),
			prefix, fwp->header->name);
	}
падает на третьей итерации.

Похоже, у тебя фирмварь битая.

Воткнул перед fprintf вот это: printf("%s\n", fwp->header->name);. Сегфолт.

В общем, действительно, битая фирмварь: сообщает, что там 4 куска, а на деле их три.

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

Это разрабы нашаманили так от восточноевропейских Кулибиных :-D

Не подскажите, как это обойти?

З.Ы. Такой вот реверс )

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

P.S. Как обычно, обнаружил методом тыка. Потому как с gdb я вообще не дружу. А уж valgrind для меня — страх и ужас!

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

Спасибо за помощь!

Не зря я Вас кастовал

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

Взять оригинальный контент (из чего собрали фирмварь) и собрать ее правильно.

Либо пропатчить: "s/fw->part_count/fw->part_count - 1/g" (ХЗ, может и не поможет, там много чего надо править).

А вообще, по-хорошему, ледует переделать код: как минимум, добавить проверку размеров блоков (т.е. если тебе в структуре данных дают значение "прочитай 4 члена", а по факту их три, то хотя бы материться и говорить, что неправильный бинарник подсунули).

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

Взять оригинальный контент (из чего собрали фирмварь) и собрать ее правильно.

Если бы это было возможно, я не ковырялся бы с бинарником :-(

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

Попарсил ubnt-mkfwimage — на первый взгляд нет косяков с формированием файла. В общем, каким-то образом таки сформировали хрен знает что.

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

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

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