Уже задавал подобный вопрос но ответа так и не получил, веренее была пара советов, но они не оказали эффекта.
Так что повторюсь. Имеется модуль, в нём реализована функция write ну и конечно же создаётся девайс, который юзается через внешнюю прогу.
Вот код проги:
/*****************************************************************/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
char *num; //num of parametrs
//convert int to char
void int_to_char(int n)
{
...
}
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,strlen(end) + 1);
return 0;
}
else write(fd, argv[1], strlen(argv[1]) + 1);
if(!argv[2])
{
printf("wrte 2$\n");
write(fd,end,strlen(end) + 1);
return 0;
}
else write(fd, argv[2], strlen(argv[2]) + 1);
if(!argv[3])
{
printf("write 3$\n");
write(fd,end,strlen(end) + 1);
return 0;
}
else write(fd, argv[3], strlen(argv[3]) + 1);
if(ap > 0)
{
//write num of parametrs
int_to_char(ap/2);
write(fd, num, strlen(num) + 1);
//write parametrs
for(i = argc - ap; i < argc; i++)
{
printf(argv[i]);
printf("\n");
write(fd, argv[i], strlen(argv[i]) + 1);
}
}
//write symbol to finish transacton, in this case it's "$"
printf("write 4$\n");
write(fd,end,strlen(end) + 1);
//close file
close(fd);
printf("Device netfw close\n");
free(num);
return EXIT_SUCCESS;
}
/*****************************************************************/
А вот та часть кода модуля которая глючит.
/*****************************************************************/
n_arg++;
}
n++;
}
if(!strcmp(ch,"$")){
step = -1;
n = n_par = n_arg = 0;
if(act > 0) {
struct netfw_table *tab;
switch(act){
case NETFW_ADD_RULE:
/*if(*/netfw_add_rule(to_table,0,it,par,arg,num)/*)*/;
break;
case NETFW_DEL_RULE:
// tab = netfw_get_table_by_name(to_table)/*)*/;
// if(tab)/*if(*/tab->set_rule(NETFW_DEL_RULE,0,to_table,-2,it,par,arg,nu
m)/*)*/;
// else printk("ERROR at del rule for table - %s!!!\n",to_table);
break;
case NETFW_SET_POL:
tab = netfw_get_table_by_name(to_table);
if(tab)/*if(*/tab->set_rule(NETFW_SET_POL,0,0,0,it,0,0,0)/*)*/;
else printk("NetFW: ERROR at set new policy for table - %s!!!\n",to_table);
break;
case NETFW_SHOW_RULE:
// tab = netfw_get_table_by_name(to_table);
// if(tab)/*if(*/tab->set_rule(NETFW_SHOW_RULE,0,0,0,0,0,0,0)/*)*/;
// else printk("ERROR at show rule for table - %s!!!\n",to_table);
break;
}
}
if(par) kfree(par);
if(arg) kfree(arg);
if(to_table) kfree(to_table);
if(out) kfree(out);
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);
if(par) kfree(par);
if(arg) kfree(arg);
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;
}
//for device
struct file_operations Fops =
{
read: netfw_read,
write: netfw_write,
ioctl: netfw_ioctl,
};
/*****************************************************************/
Вообщем ситуация обстоит так. После третьего (а иногда и второго)
вызова проги, т.е. после того как функция записи вызвана
происходит сегфолт. Вот вывод лога
Aug 19 12:20:24 dell kernel: par[0] = from, ch = from, parg = from
Aug 19 12:20:24 dell kernel: arg[0] = 127.0.0.1, ch = 127.0.0.1, parg = 127.0.0.1
Aug 19 12:20:28 dell kernel: par[0] = from, ch = from, parg = from
Aug 19 12:20:28 dell kernel: c8e954aa
Aug 19 12:20:28 dell kernel: Modules linked in: netfw ipv6 rfcomm hidp l2cap speedstep_lib freq_table thermal processor fan button battery ac hci_usb bluetooth snd_pcm_oss snd_mixer_oss snd_seq_midi snd_seq_midi_event snd_seq evdev joydev sg st sr_mod edd snd_es1968 gameport snd_ac97_codec snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device intel_agp snd agpgart soundcore uhci_hcd usbcore yenta_socket rsrc_nonstatic i2c_piix4 pcmcia_core i2c_core parport_pc lp video1394 ohci1394 parport raw1394 ieee1394 capability subfs sd_mod scsi_mod dm_mod reiserfs ide_cd cdrom ide_disk piix ide_core
Aug 19 12:20:28 dell kernel: CPU: 0
Aug 19 12:20:28 dell kernel: EIP: 0060:[<c8e954aa>] Tainted: P U VLI
Aug 19 12:20:28 dell kernel: EFLAGS: 00010246 (2.6.11.4-20a-default)
Aug 19 12:20:28 dell kernel: EIP is at netfw_write+0x16a/0x5c0 [netfw]
Aug 19 12:20:28 dell kernel: eax: 2e373231 ebx: ffffffff ecx: 00000000 edx: 00000000
Aug 19 12:20:28 dell kernel: esi: c60ec4e1 edi: 2e373231 ebp: c60ec4e0 esp: c4cfff6c
Aug 19 12:20:28 dell kernel: ds: 007b es: 007b ss: 0068
Aug 19 12:20:28 dell kernel: Process netfw (pid: 5854, threadinfo=c4cfe000 task=c7211a80)
Aug 19 12:20:28 dell kernel: Stack: c60ec4e0 2e373231 0000000a bffff615 c8e95340 0000000a c60dd880 bffff615
Aug 19 12:20:28 dell kernel: c0151313 c4cfffac c60dd880 fffffff7 08048fa0 c4cfe000 c015143c c4cfffac
Aug 19 12:20:28 dell kernel: 00000000 00000000 00000000 00000003 40016cc0 c0102c49 00000003 bffff615
Aug 19 12:20:28 dell kernel: Call Trace:
Aug 19 12:20:28 dell kernel: [<c8e95340>] netfw_write+0x0/0x5c0 [netfw]
Aug 19 12:20:28 dell kernel: [<c0151313>] vfs_write+0x93/0x110
Aug 19 12:20:28 dell kernel: [<c015143c>] sys_write+0x3c/0x70
Aug 19 12:20:28 dell kernel: [<c0102c49>] sysenter_past_esp+0x52/0x79
Aug 19 12:20:28 dell kernel: Code: e8 3c f0 33 f7 85 c0 74 51 68 0f 6f e9 c8 eb db 8b 3d ac 86 e9 c8 8b 15 9c 86 e9 c8 89 3c 24 89 ee 8b 04 97 89 44 24 04 89 c7 ac <aa> 84 c0 75 fa 8b 04 24 8b 4c 24 04 89 0c 90 89 e8 e8 e0 7e 2a
Пробовал сделать par[] и arg[] в виде списков, не помогло.
Заранее спасибо!!!
Ответ на:
комментарий
от Dead

Ответ на:
комментарий
от cyclon
Ответ на:
комментарий
от Dead

Ответ на:
комментарий
от cyclon
Ответ на:
комментарий
от erDiZz

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Выделение памяти в модуле. (2005)
- Форум Проблемма с выделением памяти в модуле. (2005)
- Форум Теряется *char. (2005)
- Форум Си (2013)
- Форум [C] Параметры, Case (2012)
- Форум Помогите доработать лабу (2007)
- Форум «Ненормальное» сравнение переменной shn с единицей. (2010)
- Форум Помогите реализовать блочный ввод- вывод. (2011)
- Форум Передача и вывод int в ядре. (2005)
- Форум Ошибка сегментирования (2017)