Ошибка сегментирования (сделан дамп памяти) на C и Ubuntu?

Здравствуйте!
Не пойму из за чего выходит ошибка. При первой итерации он запись в базу делает, но потом сразу вылетает ошибка. Гуглил по поводу утечек и обращения в чужой сегмент, но ничего толком не понял. Поэтому прошу ткнуть носом в миску. Где и что надо исправить?

Вот собственно код:
#include <my_global.h>
#include <mysql.h>
#include <string.h>

void puterror(char *);
void getDesc(char *);
void insertLang(char *);

int main(int argc, char *argv[])
{
  MYSQL conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  if(!mysql_init(&conn))
     puterror("Error: can't create MySQL-descriptor\n");

  if(!mysql_real_connect(&conn, "localhost", "root", "password", "Almata", 0, NULL,0))
     puterror("Error: can't connect to MySQL server\n");

  if(mysql_query(&conn, "SET NAMES 'utf8'") != 0)
     puterror("Error: can't set character set\n");

  if(mysql_query(&conn, "SELECT * FROM lib_book") != 0)
     puterror("Error: can't execute SQL-query\n");

  res = mysql_store_result(&conn);
  if(res == NULL) puterror("Error: can't get the result description\n");

  if(mysql_num_rows(res) > 0)
  {
    while((row = mysql_fetch_row(res)) != NULL)
    {
      getDesc(row[36]);
    }
  }

  mysql_free_result(res);
  mysql_close(&conn);
  
}


void getDesc(char * book_id){
	char * queryStr = "SELECT * FROM tbl_BookDesc WHERE ID_Book=";
	char * new_str;
	if((new_str = malloc(strlen(queryStr)+strlen(book_id)+1)) != NULL){
	    new_str[0] = '\0';   // ensures the memory is an empty string
	    strcat(new_str,queryStr);
	    strcat(new_str,book_id);
	} else {
	    printf("malloc failed!\n");
	    // exit?
	}
	MYSQL conn1;
  MYSQL_RES *res1;
  MYSQL_ROW row1;
  char * insQuery = "";
  if(!mysql_init(&conn1))
     puterror("Error: can't create MySQL-descriptor\n");

  if(!mysql_real_connect(&conn1, "localhost", "root", "password", "books", 0, NULL,0))
     puterror("Error: can't connect to MySQL server\n");

  if(mysql_query(&conn1, "SET NAMES 'utf8'") != 0)
     puterror("Error: can't set character set\n");

  if(mysql_query(&conn1, new_str) != 0)
     puterror("Error: can't execute SQL-query\n");
  free(new_str);
  new_str=NULL;
  res1 = mysql_store_result(&conn1);
  if(res1 == NULL) puterror("Error: can't get the result description\n");

  if(mysql_num_rows(res1) > 0)
  {
    while((row1 = mysql_fetch_row(res1)) != NULL)
    {
    	insQuery = "";
      fprintf(stdout, "%s,%s,%s,%s,%s\n", row1[0], row1[1], row1[2], row1[3], row1[4]);
      if(strncmp(row1[1],"71",2)==0){
      	if (strncmp(row1[3],"20",2)==0)
      	{
      		insQuery = "INSERT INTO lib_book_language (book_language_id, book_language_type_id, book_id) VALUES (1, 1, ";
      		char * new_ins_str;
					if((new_ins_str = malloc(strlen(insQuery)+strlen(book_id)+10)) != NULL){
					  new_ins_str[0] = '\0';   // ensures the memory is an empty string
					  strcat(new_ins_str,insQuery);
					  strcat(new_ins_str,book_id);
					  strcat(new_ins_str,")");
					} else {
					  printf("malloc failed!\n");
					  // exit?
					}
      		insertLang(new_ins_str);
      		free(new_ins_str);
      		new_ins_str=NULL;
      	}
      	if (strncmp(row1[3],"22",2)==0)
      	{
      		insQuery = "INSERT INTO lib_book_language (book_language_id, book_language_type_id, book_id) VALUES (7, 1, ";
      		char * new_ins_str;
					if((new_ins_str = malloc(strlen(insQuery)+strlen(book_id)+10)) != NULL){
					  new_ins_str[0] = '\0';   // ensures the memory is an empty string
					  strcat(new_ins_str,insQuery);
					  strcat(new_ins_str,book_id);
					  strcat(new_ins_str,")");
					} else {
					  printf("malloc failed!\n");
					  // exit?
					}
      		insertLang(new_ins_str);
      		free(new_ins_str);
      		new_ins_str=NULL;
      	}
      	if (strncmp(row1[3],"23",2)==0)
      	{
      		insQuery = "INSERT INTO lib_book_language (book_language_id, book_language_type_id, book_id) VALUES (2, 1, ";
      		char * new_ins_str;
					if((new_ins_str = malloc(strlen(insQuery)+strlen(book_id)+10)) != NULL){
					  new_ins_str[0] = '\0';   // ensures the memory is an empty string
					  strcat(new_ins_str,insQuery);
					  strcat(new_ins_str,book_id);
					  strcat(new_ins_str,")");
					} else {
					  printf("malloc failed!\n");
					  // exit?
					}
      		insertLang(new_ins_str);
      		free(new_ins_str);
      		new_ins_str=NULL;
      	}
      	if (strncmp(row1[3],"24",2)==0)
      	{
      		insQuery = "INSERT INTO lib_book_language (book_language_id, book_language_type_id, book_id) VALUES (1, 1, ";
      		char * new_ins_str;
					if((new_ins_str = malloc(strlen(insQuery)+strlen(book_id)+10)) != NULL){
					  new_ins_str[0] = '\0';   // ensures the memory is an empty string
					  strcat(new_ins_str,insQuery);
					  strcat(new_ins_str,book_id);
					  strcat(new_ins_str,")");
					} else {
					  printf("malloc failed!\n");
					  // exit?
					}
      		insertLang(new_ins_str);
      		free(new_ins_str);
      		new_ins_str=NULL;
      	}
      	if (strncmp(row1[3],"25",2)==0)
      	{
      		insQuery = "INSERT INTO lib_book_language (book_language_id, book_language_type_id, book_id) VALUES (5, 1, ";
      		char * new_ins_str;
					if((new_ins_str = malloc(strlen(insQuery)+strlen(book_id)+10)) != NULL){
					  new_ins_str[0] = '\0';   // ensures the memory is an empty string
					  strcat(new_ins_str,insQuery);
					  strcat(new_ins_str,book_id);
					  strcat(new_ins_str,")");
					} else {
					  printf("malloc failed!\n");
					  // exit?
					}
      		insertLang(new_ins_str);
      		free(new_ins_str);
      		new_ins_str=NULL;
      	}
      }

    }
  }
  free(insQuery);
  insQuery=NULL;
  mysql_free_result(res1);
  mysql_close(&conn1);
}

void insertLang(char * ins_str){
	MYSQL conn2;
  MYSQL_RES *res2;
  MYSQL_ROW row2;

  if(!mysql_init(&conn2))
     puterror("Error: can't create MySQL-descriptor\n");

  if(!mysql_real_connect(&conn2, "localhost", "root", "password", "Almata", 0, NULL,0))
     puterror("Error: can't connect to MySQL server\n");

  if(mysql_query(&conn2, "SET NAMES 'utf8'") != 0)
     puterror("Error: can't set character set\n");
  printf("%s\n", ins_str);
  if(mysql_query(&conn2, ins_str) != 0)
     puterror("Error: can't execute SQL-query\n");
  free(ins_str); 
  ins_str=NULL;
  mysql_free_result(res2);
  mysql_close(&conn2);
}

void puterror(char * str)
{
  printf("%s", str);
  exit(1);
}
  • Вопрос задан
  • 1529 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmtrrr
Backend developer
Используй gdb для анализа core dump
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы