Foro de elhacker.net

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

Código:
echo add 10 > /proc/mimod

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

Código:
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:

Código:
//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.