LINUX.ORG.RU

Феерический баг LoudMouth. Что делать?


0

0
wieker@localhost:~/Projects/ksj$ dpkg -l *loud*
ii  libloudmouth1-0                         1.4.3-5                                 Lightweight C Jabber library
ii  libloudmouth1-dev                       1.4.3-5                                 Development files for Loudmouth Jabber library

Этот код работает абсолютно нормально:

#include <stdio.h>
#include <stdlib.h>
#include <loudmouth/loudmouth.h>

int main(int argc, char* argv)
{
	LmMessage* m;
	LmConnection* conn;
	GError* error = NULL;

	conn = lm_connection_new("jabber.ru");
	lm_connection_open_and_block(conn, &error);
	lm_connection_authenticate_and_block(conn, "lmtest", "up8a34go0", "test", &error);
	
	m = lm_message_new ("wieker@jabber.ru", LM_MESSAGE_TYPE_MESSAGE);
	lm_message_node_add_child (m->node, "body", "тест");
	
	lm_connection_send (conn, m, &error);
	
	lm_message_unref(m);
	lm_connection_close(conn, NULL);
	lm_connection_unref(conn);
	return 0;
}

А этот вызывает зависание системы:

#include <stdio.h>
#include <stdlib.h>
#include <loudmouth/loudmouth.h>

void connect()
{
	LmMessage* m;
	LmConnection* conn;
	GError* error = NULL;

	conn = lm_connection_new("jabber.ru");
	lm_connection_open_and_block(conn, &error);
	lm_connection_authenticate_and_block(conn, "lmtest", "up8a34go0", "test", &error);
	
	m = lm_message_new ("wieker@jabber.ru", LM_MESSAGE_TYPE_MESSAGE);
	lm_message_node_add_child (m->node, "body", "тест");
	
	lm_connection_send (conn, m, &error);
	
	lm_message_unref(m);
	lm_connection_close(conn, NULL);
	lm_connection_unref(conn);
}

int main(int argc, char** argv)
{
	connect();
	return 0;
}

Что-то я не понял, как вынос кода в функцию может давать такие последствия? (зависает, потому что вызывается слишком много процессов)

★★

Ответ на: комментарий от wieker

Утечка будет если в одной из функций произойдет ошибка, а ты ее не обработаешь.

Может где-то повреждается хип из-за неверно переданных данных или неправильно очищенной памяти.

e3d08dff
()

Это не баг loudmouth, а твой. В твоем бинарнике присутствует функция connect, которая перекрывает connect из libc.so.

Используй либо static void connect(), либо назови ее как-нибудь по-другому.

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