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

Модератор: Fastman

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

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

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

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

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

harmless
ст. прапорщик
Сообщения: 589
Зарегистрирован: 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: Решений "искаропки" под конкретную задачу - катастрофически мало.
Любое боле-мене серьёзное решение - это кручение коробки под себя.


Вернуться в «C/C++»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя