Страница 1 из 1

Толи лыжи не едут, толи ....(программа на С)

Добавлено: 2013-07-26 0:50:09
harmless
Доброе время суток товарищи!
Возникла внештатная ситуация(вернее застрял по самые [классический секс])
имеем такие 5 функций в арсенале

Код: Выделить всё

void ipfw_table(void) {
	int				i;
	syslog(LOG_INFO, "ipfw_table function work");
	if (mysql_query(conn, "SELECT `ip`, `bw` FROM `clients` WHERE `status` != 'off';")) {
		syslog(LOG_ERR, "Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		exit(EXIT_FAILURE);
	}
	result = mysql_store_result(conn);
	num_fields = mysql_num_fields(result);
	
	while ((row = mysql_fetch_row(result))) {
		for(i = 0; i < num_fields; i++) { 
			add_bw(row[i],ipfw2_table_in,atoi(row[i+1]));
			add_bw(row[i],ipfw2_table_out,atoi(row[i+1]));
			i++ ;
		}
	}

	mysql_free_result(result);
}
void add_bw(char* ip, int ipfw_table, int bw) {
	char*		cmd = malloc(100);
	sprintf(cmd, "/sbin/ipfw -q table %d add %s %d",ipfw_table,ip,bw);
	execute(cmd);
	syslog(LOG_INFO, "IP %15s with BW %10s added to BW-table successfully\n", ip, bw);
	free(cmd);
}
void arp_table(void) {
	int				i;
	if (mysql_query(conn, "SELECT `ip`, `mac` FROM `clients` WHERE `mac` != '';")) {
		syslog(LOG_ERR, "Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		exit(EXIT_FAILURE);
	}
  	result = mysql_store_result(conn);
	int num_fields = mysql_num_fields(result);

	while ((row = mysql_fetch_row(result))) {
		for(i = 0; i < num_fields; i++) {
			add_mac(row[i], row[i+1]);
			i++;
		}
	}
	mysql_free_result(result);
}
void add_mac(char* ip, char* mac) {
	char*		cmd = malloc(100);
	sprintf(cmd, "/usr/sbin/arp -s %s %s only",ip,mac);
	execute(cmd);
	syslog(LOG_INFO, "IP %15s with MAC %10s added to table successfully\n", ip, mac);
	free(cmd);
}
char *execute(char* string) {
	FILE	*fpipe;
	char*	buff = malloc(100);
	if (!(fpipe = (FILE*)popen(string,"r"))) {
        syslog(LOG_ERR,"problems with open command pipe");
        return 0;
    }
	fgets(buff, sizeof(buff),fpipe);
    pclose(fpipe);
	return buff;
}
Компилиться программа нормально(приведены именно те функции на которых застрял)
Проблема:
при вызове комманды add_bw(....) программа падает в корку
но при этом комманда add_mac(....) отрабатывает нормально
В чём подвох?
З.Ы. Знаю что программа написана на костылях, просто набираю функционал постепенно

Re: Толи лыжи не едут, толи ....(программа на С)

Добавлено: 2013-07-26 10:18:31
ChihPih
Лучше юзать snprintf, чтоб за пределы бефера не вылезть
Почему нет проверки указателя после malloc, может произошла ошибка и вернулось NULL?
Отлаживать методом исключения (комментирования), чтоб найти строку на которой в корку падает.

Re: Толи лыжи не едут, толи ....(программа на С)

Добавлено: 2013-07-26 10:31:16
harmless
Нашел косяк.
в функции add_bw()

Код: Выделить всё

void add_bw(char* ip, int ipfw_table, int bw) {
   char*      cmd = malloc(100);
   sprintf(cmd, "/sbin/ipfw -q table %d add %s %d",ipfw_table,ip,bw);
   execute(cmd);
--   syslog(LOG_INFO, "IP %15s with BW %10s added to BW-table successfully\n", ip, bw); // тут bw хотел использовать как строку
++  syslog(LOG_INFO, "IP %15s with BW %d added to BW-table successfully\n", ip, bw); // а забыл просто что перевел переменную в число(много изменений просто сделал за день))
   free(cmd);
}

Re: Толи лыжи не едут, толи ....(программа на С)

Добавлено: 2014-03-25 16:59:06
konstantine
Странно, а как тогда компилиось и даже без варнингов ?