LINUX.ORG.RU

NSS_init возвращает ошибку SecFailure

 ,


0

1

Пишу программу, которая восстанавливает пароли пользователя с помощью библиотек Firefox. ОС - убунту.

sudo apt-get install libnss3

Далее примерно такой код

	void* nssLib = dlopen("libnss3.so",RTLD_LAZY);
	
	if(nssLib == NULL)
		{
		fprintf(stderr,"dlopen() error: %s\n", dlerror()); 	
		return 1; 
		}
	
	NSS_Init = dlsym(nssLib,"NSS_Init");
NSS_Init (тут_путь_к_профилю_лисы) 

Код прекрасно работает на убунте из WSL (подсистема на десятой винде), но при переносе на реальную убунту NSS_Init возвращает -1. Пробовал по разному, и полный путь, и относительный, и слеш в конце, и даже бинарник копировал - одинаковый результат. Документации никакой нет. Что это может быть?

Да, там и правда отвратительная документация, как и везде у современной мозиллы где дело касается исходников софта. Но всё-таки она есть.

После того как вернуло ошибку делай вот это:

  if((len=PR_GetErrorTextLength())>0) {
    text = alloca(len);
    if(PR_GetErrorText(text)>0) fprintf(stderr, "NSS: %s\n", text);
  } else {
    fprintf(stderr, "NSS: Error %d.\n", (int)PR_GetError());
  }

Там будет более подробная причина. Если ошибка числовая, то расшировку ищи в файлах nss/sslerr.h, nss/secerr.h, nspr/prerr.h

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

И зачем возня с dlopen()? Просто слинкуй его

apt-get install libnss3-dev libnspr4-dev


-I/usr/include/nss -I/usr/include/nspr -lnss3 -lnssutil3 -lsmime3 -lssl3 -lplds4 -lplc4 -lnspr4
firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Может, дело в библиотеках? Взял уже ради интереса либу с самой директории лисы

dlopen() error: /usr/lib/x86_64-linux-gnu/libnssutil3.so: version >`NSSUTIL_3.39’ not found (required by /usr/lib/firefox/libnss3.so)

пишет опять какой-то бред.

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

secerr.h

SEC_ERROR_BASE = -0x2000

SEC_ERROR_LEGACY_DATABASE = (SEC_ERROR_BASE + 177),

По ссылке наверно устаревшая документация, там даже домен «www-archive». Посмотрел бы у себя в /usr/include думаю нашёл бы.

Видимо у тебя старая версия файрфокса и в её профилях старый формат базы nss, а в своей проге ты используешь новую libnss.

dlopen() error: /usr/lib/x86_64-linux-gnu/libnssutil3.so: version >`NSSUTIL_3.39’ not found (required by /usr/lib/firefox/libnss3.so)

Ил наоборот в фф более новая libnss, посмотри какие там где версии.

Сделай LD_LIBRARY_PATH=/usr/lib/firefox чтобы брало все библиотеки оттуда.

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

Да я разные профили уже пробовал, и старые и новые; одинаково ошибка.

Сделай LD_LIBRARY_PATH=/usr/lib/firefox чтобы брало все библиотеки оттуда.

А где это сделать ? Я использую codelite.

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

Я не про старые/новые профили а про версию фф, которая их последней открывала.

LD_LIBRARY_PATH это переменная окружения, обычно её прописывают в командной строке перед именем запускаемой программы через пробел. Но если ты программы из IDE запускаешь то это разве что где-то в IDE можно прописать (не уверен что там это предусмотрено).

Ну или если грузишь библиотеку через dlopen() то возможно он учтёт переменные, установленные через setenv().

update: судя по найденному - нет, не учтёт, надо только заранее её устанавливать.

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

text = alloca(len);

Потом, конечно, будет очередное затыкание дырок в мыле, краснение перед списком CVE и прочее.

Просто напиши malloc. Столько же букв. В случае с Init можно даже не освобождать память. Можно даже не проверять на NULL, сегфолт можно пережить – или использовать xmalloc. Можно даже сделать макрос с __attribute__((__cleanup__(free))).

Но сишники все равно пишут alloca.

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

Ладно, сейчас посмотрел описание функции - теоретически и правда могут быть проблемы. Ну немножко оправдаюсь.

Ну вообще конкретно этот код - наполовину копипаст откуда-то. А всё потому что я, разбираясь с NSS, столкнулся с той же проблемой что и автор: отсутствие вменяемой документации, и первоначально хотел сделать чтобы оно хоть как-то работало. Если бы писал сам - писал бы этот кусок по-другому (он вообще некрасиво смотрится), та софтина по сути так и осталась прототипом с подобной ерундой.

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

Чем плохо юзать alloca ? malloc надо следить, чтобы память освобождалась, потом утечки памяти. А тут на стеке выделил и всё.

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

malloc надо следить, чтобы память освобождалась, потом утечки памяти

Не является проблемой. Утечка памяти, даже если произойдет, не приведет к отказу приложения. Более того, утечка утечке рознь – например, здесь, где NSS_Init будет вызываться единожды, разовая утечка памяти никакого вреда не составит.

А тут на стеке выделил и всё.

Без проблем. Ты можешь гарантировать, что ты можешь выделить len байт на стеке?

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

Без проблем. Ты можешь гарантировать, что ты можешь выделить len байт на стеке?

конкретно в этом примере да, ибо тут копейки, а так хз; я не особо спец по линуксу. Под виндой у меня есть 1 мегабайт стека, и для мелочевки вполне. Но это не суть. по теме - так и не решил задачу. Парадокс. На винде работает, на WSL убунте тоже, а на живой нет. Подозреваю, что дело именно в NSS3, видимо оно отличается в папке мозилы и то, что в системе (неясно почему и как понять), но на практике не могу установить рабочую директорию для программы. Писал chdir(папка_фаерфокс), один черт берет библиотеки системные..

zer0cat
() автор топика

Попробуй выполнить свое приложение под strace, заверши работу на вызове NSS_Init и посмотри, к каким ресурсам лезло и не нашло. Может станет понятнее.

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