Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: kaostias en 24 Octubre 2013, 19:16 PM

Título: Problemas con Proc en el kernel de linux
Publicado por: kaostias en 24 Octubre 2013, 19:16 PM
Buenas, estoy haciendo un módulo que sea una lista de enteros que se actualice cada vez que se actualiza una entrada en proc en concreto /proc/mimod. El caso es que compila y lo instalo en el kernel, y cuando quiero utilizar un comando, (Sólo acepta dos, add y remove), de la forma

echo add 10 > /proc/mimod

Estalla(NullPointerException). No sé muy bien cómo funciona aún. Aquí asigno los callback


static int addProcEditor(void){
   clipboard = (char *)vmalloc( BUFFER_LENGTH );
   if (!clipboard) {
     ret = -ENOMEM;
   } else {
     memset( clipboard, 0, BUFFER_LENGTH );
     proc_entry = create_proc_entry("mimod",0777, NULL);
     if (proc_entry == NULL) {
       ret = -ENOMEM;
       vfree(clipboard);
       printk(KERN_INFO "modlist: No puedo crear la entrada en proc\n");
     } else {
       posicionactual=0;
      [glow=red,2,300] proc_entry->read_proc = procWritten;
       proc_entry->write_proc = procIsRead;[/glow]
       printk(KERN_INFO "modlist: Cargado el Modulo.\n");
     }
   }
   return 0;
}


Aquí hago las lecturas y escrituras:


//Reconoce el cambio del proc y ejecuta este programa
int procWritten( struct file *punterofichero, const char __user *bufferusuario,
unsigned long longitud, void *data){
 char* str;
 int espaciodisponible = (BUFFER_LENGTH-posicionactual)+1;

 if (longitud > espaciodisponible) {
   printk(KERN_INFO "mimod: el buffer esta lleno!\n");
   return -ENOSPC;
 }
 if (copy_from_user( &str[0], bufferusuario, longitud )) {
   return -EFAULT;
 }
 clipboard[longitud] = 0;
 int num;
 int i = reconocedor(clipboard,&num);
 switch(i){
 case 1://add
 add(num);
 break;
 case 2://remove
 myremove(num);
 break;
 }

 return longitud;

}
//Escribe en proc lo que deseemos
int procIsRead( char *buffer, char **bufferlocation, off_t offset,
                  int buffer_lenghth, int *eof, void *data )

{
 int len;

 if (offset > 0) {
   /* hemos llegado al final */
   *eof = 1;
   len =0;
 } else {
 len = cats(buffer);
 int num;
 }
 return len;
}


Cuando va a utilizar cats (lo único que hace es copiar una lista al buffer, peta) y cuando tiene que añadir también. No sé muy bien qué falla. ¿Alguna idea? Lo que puedo suponer es que la cadena recibida no se pasa bien o algo así, pero no tengo ni idea.

Gracias
Título: Re: Problemas con Proc en el kernel de linux
Publicado por: kaostias en 29 Octubre 2013, 20:30 PM
Tenía un par de problemas con punteros, nada importante, gracias de todas formas. Si a alguien le interesa la resolución la cuelgo.