Hello,
I am using openSSL 0.9.2b. I have written a simple client program
which try to establish the communication with a server understands
SSL.
The sample code is attached. It runs fine. But when I use 'purify'
to debug it, I found a lot of UMR (Uninitialized Memory Read) errors,
most of them are from RAND-seed(), ssleay_rand().
Are those errors supposed to be there? or I missed some initialization
steps?
Thanks,
Renjie
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
/* OpenSSL headers*/
#include "ssl.h"
#include "x509.h"
#include "err.h"
int init_socket(char *hostName, int port);
void check_err();
void check_ssl_err();
void main (int argc, char* argv[])
{
int err = 0;
int sd;
char* str = NULL;
char buf[4096];
SSL_METHOD *meth = NULL;
SSL_CTX *ctx = NULL;
SSL *ssl = NULL;
X509 *server_cert = NULL;
sd = init_socket(argv[1], atoi(argv[2]));
/* initialize SSL */
SSL_load_error_strings();
SSL_library_init();
if((meth=SSLv3_client_method())==NULL) check_ssl_err();
if((ctx=SSL_CTX_new(meth))==NULL) check_ssl_err();
if((ssl=SSL_new(ctx))==NULL) check_ssl_err();
/* establishing SSL connection through the socket */
SSL_set_fd(ssl,sd);
if((err=SSL_connect(ssl))==-1) check_ssl_err();
/* communicate through SSL connection */
err = SSL_write(ssl,request,strlen(request));
if(err==-1) check_ssl_err();
do
{
err = SSL_read(ssl,buf,sizeof(buf)-1);
if(err==-1) check_ssl_err();
buf[err] = '\0';
printf ("Got %d chars:\n%s\n", err, buf);
} while(err!=0);
/* shutdown and clean up. */
shutdown(sd,1);
close(sd);
SSL_free(ssl);
SSL_CTX_free(ctx);
}
int init_socket(char *hostName, int port)
{
int sd;
int err;
struct hostent *host=NULL;
struct sockaddr_in sa;
if(hostName==NULL) return -1;
if((host=gethostbyname(hostName))==NULL) check_err();
bcopy(host->h_addr, &sa.sin_addr, sizeof(sa.sin_addr));
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
if((sd=socket(AF_INET, SOCK_STREAM,0))==-1) check_err();
if((err=connect(sd, (struct sockaddr*) &sa,sizeof(sa)))==-1) check_err();
return sd;
}
void check_err()
{
perror("Error:");
exit(1);
}
void check_ssl_err()
{
int err;
char *str;
char buf[1024];
err = ERR_get_error();
str = ERR_error_string(err, buf);
printf("%s\n", str);
exit(1);
}