Hi all,
I am writing a C++ wrapper class as an interface into certain openSSL
commands, and when I call SSL_write, I get a SIGBUS. I traced through with
gdb and where this call takes place, I tried to 'print ssl' I get:
$5 = (SSL*) 0x656e7449,
then I do 'print *ssl' I get:
Cannot access memory at address 0x656e7449
This is obviously the cause for the SIGBUS as SSL_write(ssl...) tries to
make use of this structure.
Here are my machine stats:
~ 73 >uname -a
SunOS candlestick 5.7 Generic_106541-08 sun4u sparc SUNW,Ultra-5_10
~ 74 >g++ --version
2.95.2
~ 76 >gdb --version
GNU gdb 4.17
Here is my class definition, constructor, and write function... if it will
help, Ill post all my code. I get no return codes that would alert me to
any problems up until the SIGBUS.
Ive never seen anything like this before, anyone have any advise...
#ifndef __SSLWRAPPERH__
#define __SSLWRAPPERH__
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include <openssl/ssl.h>
}
#include <OsTypes.h>
class SSLhandler
{
private:
char hostName[80];
char request[200];
int port;
SSL *ssl;
SSL_CTX *ssl_ctx;
int sock;
static bool initialized;
public:
SSLhandler(char *HostName,int Port=4433);
~SSLhandler();
void getEventKey(ulong eventID,char *key,uint16_t maxLen);
private:
SSLhandler(); //hide
SSLhandler(SSLhandler&);//hide
int prngSeed();
void openSocket(char *host,int port);
inline int writeSSL(char *request,int length);
int readSSL(char *response,int maxLen);
};
#endif //__SSLWRAPPERH__
int SSLhandler::writeSSL(char *request,int length)
{
=>uint16_t ret = SSL_write(ssl,request,length);
#ifdef __DEBUG
cout << "Bytes Written:"<< ret<< endl;
cout << "Chars Written:"<< request << endl;
#endif
return ret;
}
//This can throw a couple different string errors, be prepared!
SSLhandler::SSLhandler(char *HostName,int Port)
: ssl(NULL),ssl_ctx(NULL),port(Port)
{
if (initialized == false)
{ //One time per program execution
if (prngSeed()==false) //Seed the random number generator!
throw "PRNG Error";
//Load all necessary support routines as definied by openSLL
SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
initialized = true;
}
strcpy(hostName,HostName);
ssl_ctx = SSL_CTX_new(SSLv23_client_method());
ssl = SSL_new(ssl_ctx);
//openSocket could throw an error, otherwise sets up sock
openSocket(hostName,port);
SSL_set_fd(ssl, sock);
int result = SSL_connect(ssl);
if (SSL_get_error(ssl,result) != SSL_ERROR_NONE)
{
printf ("SSL Connect Errors!\n");
while (ERR_peek_error()!=0)
printf("%s\n",ERR_error_string(ERR_get_error(),NULL));
throw "SSL Error";
}
}
Brian Snyder.vcf