Desallouer mem allouée par un membre

Signaler
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012
-
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012
-
Bonjour,
J'utilise OpenSSL pour programmer une couche sécurisée entre TCP et une application.
j'initialise la couche avec sec_initialize( ) et termine la couche avec un sec_terminate( );
1) sec_initialize( ) doit initialiser entre autres :
a) la méthode utilisée pour l'échange ( TLSv1_method( ), SSLv23_method( ), etc. )
b) et un contexte SSL : SSL_CTX
2) sec_terminate( ) doit desallouer les mémoires allouées dans sec_initialize( ). entre autre b)

J'ai crée une classe sslconfig contenant a) et b)

class sslconfig {
   SSL_method *meth;
   SSL_CTX *ctx;
   sslconfig( ){
        meth = SSL_meth( ); 
        ctx = SSL_CTX_new(meht);
   }
   ~sslconfig( ){
        SSL_free(ctx)
    }
}
 


Tous les membres / fonction commensant par SSL_ sont des objets d'openSSL.

dans sec_terminate( ) je dois desallouer la mémoire occupée par SSL_CTX.

Mes questions :
Q1) Est-ce que la manière de définir le destructeur dans la classe est correcte ? est ce que j'ai le droit de faire cela ? Est-ce une manière propre de desallouer la mémoire. Ou bien :
Q2) Est ce que je dois ne rien mettre dans ~sslconfig càd : ~sslconfig( ){ } ? Dans ce cas, je dois appeler explicitement SSL_free(ctx) dans sec_terminate( ) càd :
gsslconfig->SSL_free(ctx) ?

Merci d'avance.

10 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Le principe le plus important du C++ est le RAII (resource acquisition is initialization).
C'est à dire que tout objet est libre d'allouer des ressources, et que celles-ci ont la garantie d'être désalloué à la destruction de l'objet qui les possède.

La bonne méthode est donc de détruire ta ressource ctx dans le destructeur.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012

D'accord. Donc le code écrit ci-dessus est à priori correcte. Sauf que le compilateur rale :
"ISO C++ forbids declaration of ‘SSL_meth’ with no type" au niveau de : SSL_meth *m_meth; Puis j'ai mis extern "C" devant : extern "C" SSL_meth *m_meth; mais il rale toujours : "error: expected unqualified-id before string constant"

1) Est ce que je ne peux définir une membre d'une classe en tant qu'extern étant donné que SSL_meth est une fonction OpenSSL ?
2) Est ce que je serais obligé d'utiliser plutot une structure et la declarer extern "C" ...?
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Normalement, le type doit être défini. N'ayant le code sous les yeux, ça va être difficile de t'aider.
Peux-tu créer un exemple minimaliste ? Et me fournir la bilbiothèque SSL que tu utilises ? (Un lien suffira).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012

J'utilise OpenSSL.http://www.openssl.org/docs/ssl/ssl.html
J'ai défini la classe dans tools.h qui inclut les modules nécessaires d'openssl :
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/x509.h>



tout le code dans tools.h est dans un namespace mystack { }.

Et pourtant dans un autre fichier ( mystack.cpp ) du même package, j'avais inclus les modules ssl aussi et j'avais utilisé sans problème les fonctions et structures d'OpenSSL sans mettre d'extern "C" devant. ( je les ai pas utilisé dans une classe par contre ). On m'avait dit qu'OpenSSL peut être utilisé en c++.
( les fichiers d'entete OpenSSL font la chose suivante j'imagine : )
#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
#endif

D'où ma question de tout à l'heure : est ce que le fait de les utiliser dans une classe qui pose problème.
Le problème est - il ailleurs ?
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Il n'y a aucune raison que ce soit le fait d'être mis dans une classe qui pose problème. C'est pourquoi je demandais un exemple.
Je vais essayer d'en faire un rapidement (un code inutile, mais qui compile).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Aucun soucis avec:
// Les autres headers sont inutiles, je les ai vu déjà inclus par /usr/include/openssl/ssl.h
#include <openssl/ssl.h>
#include <openssl/err.h>

class SSLConfig
{
public:
  SSLConfig()
  {
    _meth = 0;// Ton code ici :)
    _ctx = SSL_CTX_new(_meth);
  }
  ~SSLConfig()
  {
    SSL_CTX_free(_ctx);
  }

private:
  SSL_METHOD* _meth;
  SSL_CTX* _ctx;
};

int main()
{
  SSLConfig ssl;

  return 0;
}


Compilé avec:
g++ -W -Wall -pedantic -Wabi ssl.cc -lssl


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012

D'accord, je comprends mieux ce qui se passe. Ton code compile bien. Mais quand j'essaie de faire ceci à la place de ton code :

#include <openssl/ssl.h>
#include <openssl/err.h>

class SSLConfig
{
public:
  SSLConfig(SSL_METHOD* method)
  {
    _meth = method;// Ton code ici :)
    _ctx = SSL_CTX_new(_meth);
  }
  void SSLctxfree(_ctx) // ligne 12 l'erreur est ici, il ne reconnait apparemment pas _ctx ...
  {
    SSL_CTX_free(_ctx);
  }

  ~SSLConfig();
  

private:
  SSL_METHOD* _meth;
  SSL_CTX* _ctx;
};

int main()
{
  SSL_METHOD *meth = TLSv1_method();
  SSLConfig ssl(meth);

  return 0;
}
 


le compilateur me dit :
autresslctx.cpp:12: error: ‘_ctx’ has not been declared
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Tout simplement:
 void SSLctxfree(_ctx) =>  void SSLctxfree(SSL_CTX* ctx)


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Ou si je fais attention à ce que je dis...
 void SSLctxfree(_ctx) =>  void SSLctxfree()


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
242
Date d'inscription
lundi 17 décembre 2007
Statut
Membre
Dernière intervention
5 décembre 2012

aie ... désolé, ca doit etre la fatigue.
il fallait mettre aussi SSL_METHOD à la place de SSL_meth *m_meth;
Mais sinon ca compile bien maintenant. Merci pour ton aide, ca m'a permis d'apprendre autres choses aussi.