• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

C++ Mysql Segmentation Fault

  • Автор темы lamez
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

lamez

:) :)

Windows. Mingw. G++. Mysql5141.
Сначала я подключил всё как положено и при компиляции первого MYSQL-тест-приложения получил, что SOCKET из нот э тайп... Дело понятно в чем.
Полез в mysql.h.

Смотрю:
#ifndef my_socket_defined
#ifdef __WIN__
#define my_socket SOCKET

Ну и вышел из положения так:
/* MY */ #define __CYGWIN__
#ifdef __CYGWIN__ /* CYGWIN implements a UNIX API */
#undef WIN
#undef _WIN
#undef _WIN32
#undef _WIN64
#undef __WIN__
#endif

Не знаю, верно ли... Но скомпилилось всё на ура.

Идём дальше. На Qt не обращайте внимания.

Код:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

MYSQL *mysql = mysql_init(NULL); // Все другие варианты сегфолтят сразу же

MYSQL_RES *res;
MYSQL_ROW row;

if ( !(mysql_real_connect(mysql, "127.0.0.1", "root", "", "phpmyadmin", 3306, NULL, 0)) )
cout << mysql_error(mysql) << endl;

mysql_query(mysql,"INSERT INTO `temptable` ( `id` ) VALUES ('2121');"); // срабатывает на ура
mysql_query(mysql,"show tables"); // тоже всё нормально

cout << "1" << endl;

if ((res = mysql_use_result(mysql)) == NULL)
cout << "sqlres is null" << endl;
else
{
cout << "2"<< endl;

row = mysql_fetch_row(res);

if (row != NULL){
cout << "row = " << row[0] << endl;
}

//mysql_free_result(res); // [b][font="Arial Black"][color="#FF0000"]ОПА! ЗДЕСЬ ОШИБКА!!! СЕГФОЛТ![/color][/font][/b]
cout << "2.5" << endl;
}

mysql_close(mysql);


cout << "3"<< endl;

cin >> (new char());

return a.exec(); // [b][font="Arial Black"][color="#FF0000"]ОПА! ЗДЕСЬ ОШИБКА!!! СЕГФОЛТ![/color][/font][/b]
}

Ну и если убрать все mysql строки, то никаких сегфолтов.
Если два раза пробовать строку достать:
Код:
 row = mysql_fetch_row(res);
row = mysql_fetch_row(res);
То будет сегфолт.
Если вызвать
Код:
mysql_free_result(res);
ТОЖЕ БУДЕТ СЕГФОЛТ!

Смотрел кучу аналогичных примеров. Ставил мемсеты на MYSQL*.
И еще если я юзаю MYSQL mysql, и передаю &mysql, то снова будет сегфолт.
Если я делаю так:
Код:
MYSQL *mysql;
mysql_init(mysql);
ТОже будет сегфолт.

Скомпилить коннекторы, предлагаемые с dev.Mysql.com под мингв32 не получается. Что делать?

Где ошибки?
 
L

lamez

Ну, вот, например, вызываю free_result.

0 my_path C:\Users\szinin\Documents\qt\testgui\testConsole\release\libmysql.dll 0 0x1001a907
1 ?? 0 0x004d179b
2 mysql_free_result C:\Users\szinin\Documents\qt\testgui\testConsole\release\libmysql.dll 0 0x1000297b
3 ?? 0 0x00000000


Поставил другой сервак мускула. Тоже самое.

Добавлено: Сейчас пробовал тоже самое с вижуала прокрутить. Представьте себе.. Получилось.
НО ПРОБЛЕМА НЕ РЕШЕНА. Мне нельзя пользоваться вижуалом.
Обязательно mingw-g++.
Может быть проблема в libmysql.dll? Может быть, для приложения скомпилированного в qt migwg++ под виндой нужна другая либа?)) Я в этом ничего не понимаю, подскажите.
:) :)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!