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

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

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

Непрочитанное сообщение harmless » 2013-07-26 0:50:09

Доброе время суток товарищи!
Возникла внештатная ситуация(вернее застрял по самые [классический секс])
имеем такие 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(....) отрабатывает нормально
В чём подвох?
З.Ы. Знаю что программа написана на костылях, просто набираю функционал постепенно

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

ChihPih
ст. прапорщик
Сообщения: 568
Зарегистрирован: 2009-09-04 12:23:30
Откуда: Где-то в России...
Контактная информация:

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

Непрочитанное сообщение ChihPih » 2013-07-26 10:18:31

Лучше юзать snprintf, чтоб за пределы бефера не вылезть
Почему нет проверки указателя после malloc, может произошла ошибка и вернулось NULL?
Отлаживать методом исключения (комментирования), чтоб найти строку на которой в корку падает.
www.info-x.org - информационный ресурс о ОС FreeBSD.

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

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

Непрочитанное сообщение harmless » 2013-07-26 10:31:16

Нашел косяк.
в функции 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);
}

Аватара пользователя
konstantine
ефрейтор
Сообщения: 55
Зарегистрирован: 2009-03-14 11:51:17

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

Непрочитанное сообщение konstantine » 2014-03-25 16:59:06

Странно, а как тогда компилиось и даже без варнингов ?
@lissyara: Решений "искаропки" под конкретную задачу - катастрофически мало.
Любое боле-мене серьёзное решение - это кручение коробки под себя.