initgroups() - C - Programmation
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.
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
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.
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
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 :
|
dans tdb.c
Code :
|
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.
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?
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)