Уже задавал подобный вопрос но ответа так и не получил, веренее была пара советов, но они не оказали эффекта. Так что повторюсь. Имеется модуль, в нём реализована функция 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)