initgroups()

initgroups() - C - Programmation

Marsh Posté le 24-03-2005 à 04:07:02    

j'aimerais savoir en quoi l'appel de cette fonction peut faire en sorte qu'un pointeur vers une structure ne soit plus accessible (en gros, tous les pointeurs que cette structure contient sont null et les variables à 0 une fois que l'appel de initgroups() a été fait)

Reply

Marsh Posté le 24-03-2005 à 04:07:02   

Reply

Marsh Posté le 24-03-2005 à 05:17:30    

?

Reply

Marsh Posté le 24-03-2005 à 08:13:42    

burgergold a écrit :

j'aimerais savoir en quoi l'appel de cette fonction peut faire en sorte qu'un pointeur vers une structure ne soit plus accessible (en gros, tous les pointeurs que cette structure contient sont null et les variables à 0 une fois que l'appel de initgroups() a été fait)


Cette fonction (initgroups()) ne fait pas partie du langage C. Il faut que tu donnes plus de détails sur ton environnement.


Message édité par Emmanuel Delahaye le 24-03-2005 à 22:38:26

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-03-2005 à 12:27:26    

Emmanuel Delahaye a écrit :

Cette fonction (initgroups()) ne fait pas partie du langage C. Il faut que tu donnes plus de détails sur ton environnement.


 
http://publibn.boulder.ibm.com/doc [...] groups.htm
 
c'est normalement sur tout système unix

Reply

Marsh Posté le 24-03-2005 à 15:10:03    

J'avais bien compris de quelle fonction tu parles, mais je ne comprend pas ce que tu demandes.

Reply

Marsh Posté le 24-03-2005 à 15:54:40    

matafan a écrit :

J'avais bien compris de quelle fonction tu parles, mais je ne comprend pas ce que tu demandes.


 
daccord, le problème est avec samba
 
samba fonctionne avec un process parent (le serveur) et chaque enfant est un fork du serveur qui, si bien authentifier, donnera accès à un share à la personne qui a demandé la connexion
 
Lorsque le serveur est lancé, un pointeur vers des structures TDB_CONTEXT lui permette de faire des transactions avec des fichiers .tdb (connections, sessionsid, locking, ...)
 
Lorsque du fork, ce pointeur est aussi copié à l'enfant et est utilisé pour enregistrer son id de session de ses locking de fichier.
 
Sur AIX 4.3.3 et AIX 5.2 je n'ai pas de problème. Le pointeur est accessible et tous les membres de la structure sont bien définit
 
Mais sur AIX 5.3, tout est ok jusqu'à l'appel de la fonction initgroups(), après quoi le pointeur vers le TDB_CONTEXT est toujours accessible mais tous les membres de cette structures sont null
 
j'essaye donc de comprendre qu'est-ce que cette fonction fait en background. En quoi cette fonction fait-elle que le contenu de la structure n'est plus accessible. Elle n'est ni corrompu ni effacé car en attachant le process parent à un debugger, je vois que la structure est intact

Reply

Marsh Posté le 24-03-2005 à 17:12:37    

Tes structures TDB_CONTEXT sont en shared memory ?

Reply

Marsh Posté le 24-03-2005 à 19:25:16    

matafan a écrit :

Tes structures TDB_CONTEXT sont en shared memory ?


 
j'aurais tendance à dire que non (mais je ne sais pas vraiment comment le vérifier, en tout cas y'a pas d'utilisation de shm_*)
 
l'espace mémoire de la structure est faite avec calloc
 
dans tdb.h

Code :
  1. /* this is the context structure that is returned from a db open */
  2. typedef struct tdb_context {
  3.         char *name; /* the name of the database */
  4.         void *map_ptr; /* where it is currently mapped */
  5.         int fd; /* open file descriptor for the database */
  6.         tdb_len map_size; /* how much space has been mapped */
  7.         int read_only; /* opened read-only */
  8.         struct tdb_lock_type *locked; /* array of chain locks */
  9.         enum TDB_ERROR ecode; /* error code for last tdb error */
  10.         struct tdb_header header; /* a cached copy of the header */
  11.         u32 flags; /* the flags passed to tdb_open */
  12.         struct tdb_traverse_lock travlocks; /* current traversal locks */
  13.         struct tdb_context *next; /* all tdbs to avoid multiple opens */
  14.         dev_t device;   /* uniquely identifies this tdb */
  15.         ino_t inode;    /* uniquely identifies this tdb */
  16.         void (*log_fn)(struct tdb_context *tdb, int level, const char *, ...) PRINTF_ATTRIBUTE(3,4); /* logging function */
  17.         u32 (*hash_fn)(TDB_DATA *key);
  18.         int open_flags; /* flags used in the open - needed by reopen */
  19. } TDB_CONTEXT;


 
dans tdb.c

Code :
  1. TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
  2.                          int open_flags, mode_t mode,
  3.                          tdb_log_func log_fn,
  4.                          tdb_hash_func hash_fn)
  5. {
  6.         TDB_CONTEXT *tdb;
  7.         struct stat st;
  8.         int rev = 0, locked = 0;
  9.         unsigned char *vp;
  10.         u32 vertest;
  11.         if (!(tdb = calloc(1, sizeof *tdb))) {
  12.                 /* Can't log this */
  13.                 errno = ENOMEM;
  14.                 goto fail;
  15.         }
  16.         /* ... */
  17. }

Reply

Marsh Posté le 24-03-2005 à 21:28:57    

Je dois louper un truc, mais si tes structures ne sont pas en shared memory c'est normal que tu ne puisse pas y acceder depuis le process fils, meme si tu leur transmet d'ume maniere ou d'une autre un pointeur vers ces structures : le pointeur pointe vers la meme adresse virtuelle, mais pas vers la meme adresse physique.
 
Maintenant tu dis que tu "vois" la structure dans le fils jusqu'au moment ou tu fais un initgroups. A mon avis c'est un artefact du au "copy on write" : tant que personne ne fait d'ecriture vers un segment de donnee, le process pere et le process fils utilisent le meme segment. Des que l'un des deux fait une ecriture, le segment est "duplique" et les esid (le numero de segment vu du process) dans les deux process ne pointent plus vers le meme vsid (le numero de segment vu du kernel). En fait c'est un peu plus complique que ca mais c'est l'idee.
 
Bref si tu veux acceder a tes structure depuis les deux process, il faut les placer en shared memory.

Reply

Marsh Posté le 25-03-2005 à 01:13:15    

mais là on parle du code de samba, les mecs sont quand même pas des 2 de pique :/
 
et ca marche parfaitement avec les autres OS
 
comment est-ce que ca s'explique?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed