Forum Linux.noyau problème avec sys_read

Posté par .
Tags : aucun
0
21
mai
2006
Bonjour,

Pour apprendre à mieux comprendre le noyau linux, je tente de modifier une fonction système (en l'occurrence sys_chmod).

Ma modification consiste à faire des vérifications sur un fichier pour autoriser ou non la mise de certains droits (vérification d'une signature en fin de fichier). Pour cela, je fais les appels suivants,dans une sous fonction (je ne détaille pas les vérifications sur les ouvertures de fichier, ...) :

int fichier;
int ret;
char buffer[50];

fichier = sys_open(fichier,0,0);
ret = sys_read(fichier, buffer, 50);

printk("%s\n",buffer);


Ce qu'il se passe, c'est que rien n'est lu du tout (ou du moins le buffer parait vide). La valeur de retour de sys_read est 14 (EFAULT : bad adress).

J'aimerais savoir si je m'y prends mal pour faire mes appels systèmes. Et surtout, comment remédier à mon problème.

Merci
  • # Alloc

    Posté par (page perso) . Évalué à 2.

    Je penses que le probleme est le buffer static, il doit falloir allouer le buffer (de mémoire c'est kmalloc(50*sizeof(char)) qu'il faut faire)
  • # sys_open

    Posté par . Évalué à 1.

    et consort attendent des arguments venant de l'user-space alors que toi tu l'apelle du kernel-space (je vois ca avec le printk, je suppose que ton code en executé depuis un module ?).
    Il n'est pas encouragé de faire une invocation sys_* depuis un modules (c'est même vivement décourager sauf quelques cas).
    pour le faire quand même il faut changer d'espace mémoire afin que les test de cohérence n'échoue plus.

    #include <asm/uaccess.h>
    mm_segment fs;
    fs=get_fs();
    set_fs(get_ds());

    //Apelle a tes routine
    fichier = sys_open(fichier,0,0);
    ret = sys_read(fichier, buffer, 50);

    set_fs(fs).
    • [^] # Re: sys_open

      Posté par . Évalué à 2.

      merci beaucoup, la dernière astuce fonctionne

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.