Заранее прошу прощения за назойливость ;)
Вообщем имеется модуль, в нём создаётся устройство, которое далее создаётся
mknod /dev/netfw c 252 0
В модуле есть такой код:
/*******************************************************************************
********************************/
//................. for IO at dev ....................//
int step, n_par, n_arg, n, par_accept;
char **par, **arg;
char *to_table;
int id, it, num, act;
//..........................................................//
int netfw_add_rule(char *table_name, int id, int it, char **par, char **arg, int num)
{
	int i;
	for(i = 0; i < num; i++){
		if(par[i]) kfree(par[i]);
		if(arg[i]) kfree(arg[i]);
	}
	printk( KERN_DEBUG "NetFW: Rule was add successfull\n");
	return 1;
}
//функция записи
ssize_t netfw_write (struct file *f, const char *ch, size_t size, loff_t *loff)
{
	if(num > 0)if(n < num*2)
	{
		if(par_accept)
		{
			par[n_par] = kmalloc((sizeof(char) * strlen(ch)) + 1,GFP_ATOMIC);
			if(!par[n_par]) return 0;
			par[n_par] = strcpy(par[n_par],ch);
			printk("par[%d] = %s, ch = %s\n",n_par,par[n_par],ch);	//Тестовый вывод тут
			par_accept = 0;
			n_par++;
		}
		else
		{
			arg[n_arg] = kmalloc((sizeof(char) * strlen(ch)) + 1,GFP_ATOMIC);
			if(!arg[n_arg]) return 0;
			arg[n_arg] = strcpy(arg[n_arg],ch);
			printk("arg[%d] = %s, ch = %s\n",n_arg,arg[n_arg],ch);	//И тут тоже вывод
			par_accept = 1;
			n_arg++;
		}
		n++;
	}
	if(!strcmp(ch,"$"))
	{
		step = -1;
		n = n_par = n_arg = 0;
		if(act > 0)
		{
			switch(act)
			{
				case NETFW_ADD_RULE:
					/*if(*/netfw_add_rule(to_table,0,it,par,arg,num)/*)*/;
					       break;
				...
			}
		}
		if(par) kfree(par);
		if(arg) kfree(arg);
		if(to_table) kfree(to_table);
		to_table = 0;
		num = 0;
	}
	step++;
	switch(step)
	{
		//Action
		case 1:
			if(!strcmp(ch,"add"))
			{
				act = NETFW_ADD_RULE;
			}
			if(!strcmp(ch,"del"))
			{
				act = NETFW_DEL_RULE;
			}
			if(!strcmp(ch,"policy"))
			{
				act = NETFW_SET_POL;
			}
			if(!strcmp(ch,"show"))
			{
				act = NETFW_SHOW_RULE;
			}
			break;
		//Table name
		case 2:
			to_table = kmalloc(sizeof(char[strlen(ch)]),GFP_ATOMIC);
			if(!to_table) return 0;
			to_table = strcpy(to_table,ch);
			break;
		//What to do ( aka "it" )
		case 3:
			if(!strcmp(ch,"accept"))
			{
				it = NETFW_ACCEPT;
			}
			if(!strcmp(ch,"drop"))
			{
				it = NETFW_DROP;
			}
			break;
		//Num of elements
		case 4:
			num = netfw_char_to_int((char*)ch);	//эта функция конвертит char* в int
											//работает одназначно и правильно :)
			par = kmalloc((sizeof(char *) * num),GFP_ATOMIC);
			if(!par) return 0;
			arg = kmalloc((sizeof(char *) * num),GFP_ATOMIC);
			if(!arg) return 0;
			par_accept = 1;
			break;
	}
	return 0;
}
/*******************************************************************************
********************************/
Используется это из приложения-интерфейса.
/************************************** user-space-app.c **************************************************/
char *num;
int main(int argc, char *argv[])
{
	int fd;
	char *end = "$";
	//this is dev for netfw control
	fd = open("/dev/netfw", O_RDWR);
	if(fd == -1){
		printf("open failed\n");
		return -1;
	}
	printf("Device netfw open\nTry to write\n");
	//calc num of parametrs like: from, to, fport, tport
	int ap = argc - 1 - 3;
	printf("ap = %d\n",ap);	//check it
	int i;
	//write control element like: add/del, pass/drop and name of table
	printf("argc = %d\n",argc);	//check it
	if(!argv[1]){
		printf("write 1$\n");
		write(fd,end,sizeof(end));
		return 0;
	}
	else write(fd, argv[1], sizeof(argv[1]));
	if(!argv[2]){
		printf("wrte 2$\n");
		write(fd,end,sizeof(end));
		return 0;
	}
	else write(fd, argv[2], sizeof(argv[2]));
	if(!argv[3]){
		printf("write 3$\n");
		write(fd,end,sizeof(end));
		return 0;
	}
	else write(fd, argv[3], sizeof(argv[3]));
	if(ap > 0){
		//write num of parametrs
		int_to_char(ap/2);	//эта функция конвертит int в char*
						//так же работает одназначно и без ошибок
						//устанавливает глобальную переменную char *num
		write(fd, num, sizeof(num));
	
		//write parametrs
		for(i = argc - ap; i < argc; i++)
		{
			printf(argv[i]);
			printf("\n");
			write(fd, argv[i], sizeof(argv[i]));
		}
	}
	//write symbol to finish transacton, in this case it's "$"
	printf("write 4$\n");
	write(fd,end,sizeof(end));
	
	//close file
	close(fd);
	printf("Device netfw close\n");
	return 0;
}
/*******************************************************************************
*********************************/
Вообщем запись работает по принципу конвеера и заканчивается с записью символа "$".
А суть проблеммы такая, при попытке в третий раз записать блок данных, в массивах
char **par и char **arg начинает появлятся мусор
(выглядит примерно так)
//первая запись
par[0] = from, ch = from
arg[0] = 127.0.0.1, ch = 127.0.0.1
NetFW: Rule was add successfull
//вторая запись
//Дальше идёт мусор
par[0] = , ch = from
arg[0] = -0.0.1, ch = 127.0.0.1
NetFW: Rule was add successfull
//третья запись
par[0] = J=, ch = from
arg[0] = .50.0.1, ch = 127.0.0.1
NetFW: Rule was add successfull
и при последующих действиях,
таких как выгрузка модуля или если попытаться что то cat'нуть /var/log/messages, а
иногда и просто так.. вообщем всё виснет. Как я понимаю проблемма в том что
где то не очищается память или что то похожее.
Может помочь опознать ошибку в функции записи ssize_t netfw_write () в модуле, 
как полагаю это именно там.
Заранее спасибо!!!
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от cyclon 
  
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от cyclon 
  
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от cyclon 
  
    
      Ответ на:
      
          комментарий
        от cyclon 
  
    
      Ответ на:
      
          комментарий
        от ms 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум Проблемма с выделением памяти. (2005)
 - Форум Проблемма с выделением памяти в модуле. (2005)
 - Форум Теряется *char. (2005)
 - Форум Си (2013)
 - Форум [C] Параметры, Case (2012)
 
- Форум Помогите доработать лабу (2007)
 - Форум Warnings при использовании basename () (2004)
 - Форум Ошибки (2008)
 - Форум Задачка с массивом строк на Си (2008)
 - Форум Размер структуры с вложенным массивом структур (2013)