[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: SSH.dll crash problem
[Thread Prev] | [Thread Next]
- Subject: RE: SSH.dll crash problem
- From: Ravikumar Sunkari <Ravikumar.Sunkari@xxxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 7 Oct 2014 09:38:18 +0000
- To: "libssh@xxxxxxxxxx" <libssh@xxxxxxxxxx>
Hi, I missed the CPP file. Regards, Ravi From: Ravikumar Sunkari [mailto:Ravikumar.Sunkari@xxxxxxxxxxxxxx] Sent: Tuesday, October 07, 2014 3:03 PM To: libssh@xxxxxxxxxx Subject: FW: SSH.dll crash problem Hello, I have developed a SSH server in windows using LIBSSH 0.6.0 DLL. Our testing team has found a bug in the DLL distribution. Attached are the logs and the server code that I have collected during the tests, I am getting VC++ Runtime Library -- "Debug assertion failed". Can anyone help on this, Please guide me and also let me know how can I setup windows project to debug ssh.dll Thanks & Regards, Ravi
/*
ebpsshd.c compile:
gcc -g -Wall -Wstrict-prototypes -O0 -o ebpsshd `pkg-config --cflags --libs glib-2.0` -I/home/jeetu/utils/libssh/libssh-project/include ebpsshd.c -L/home/jeetu/utils/libssh/libssh-project/build/src -lssh -L/home/jeetu/utils/libssh/libssh-project/build/src/threads -lssh_threads -lgthread-2.0
*/
/*#include<iostream>
using namespace std;*/
#include <iostream>
#include <list>
#include <vector>
#include <map>
using namespace std;
#include <libssh/libssh.h>
#include <libssh/server.h>
#include <libssh/callbacks.h>
//#include <unistd.h>
//#include <string.h>
//#include <stdio.h>
//#include <glib.h>
//#include <stdlib.h>
//#include <errno.h>
//#include <poll.h>
#include "poll.h"
//#include <sys/types.h>
//#include <sys/socket.h>
#include <WinSock2.h>
//#include <netdb.h>
//#include <fcntl.h>
#include <Windows.h>
//#include <io.h>
#pragma comment(lib, "ws2_32.lib")
//#include "key.h" //jeetu - temporary hardcoded key
#ifndef KEYS_FOLDER
#ifdef _WIN32
#define KEYS_FOLDER "C:\\Users\\inrasun3\\.ssh\\"
#define AUTHORIZED_KEYS "C:\\Users\\inrasun3\\.ssh\\ssh_host_dsa_key"
#else
#define KEYS_FOLDER "/home/jeetu/tmp/" //jeetu - temporary
#define AUTHORIZED_KEYS "/home/jeetu/tmp/authorized_keys"
#endif
#endif
typedef void* gpointer;
#define MAX_X11_AUTH_PROTO_STR_SZ 18
#define MAX_X11_AUTH_COOKIE_STR_SZ 50
//jeetu - all hardcoded defines; should probably figure out how these values came to be in the orig openssh code
#define MAX_DISPLAYS 1000
#define NI_MAXSERV 32
#define NUM_SOCKS 10
#define SSH_LISTEN_BACKLOG 128
#define SSHD_USER "INRASUN3"
#define SSHD_PASSWORD "libssh"
fd_set g_ReadSet, g_WriteSet, g_ExceptSet;
void InitSets(SOCKET ListenSocket) ;
int pubkey_auth(char* pk64);
int auth_password(const char *user, const char *password);
struct Context
{
ssh_session session;
ssh_channel channel;
int shell;
bool bAuthenticated;
};
struct BindContext
{
ssh_bind sshbind;
ssh_session session;
};
void ssh_bind_callaback_function_r(ssh_bind bind, void *userdata)
{
BindContext* bc = static_cast<BindContext*>(userdata);
SOCKET sSock = ssh_get_fd(bc->session);
}
//bool iAuthenticated = false;
int message_callback(ssh_session session, ssh_message message, void *data)
{
Context* ctx = static_cast<Context*>(data); // .... processes message and sets the channel member in the ctx struct in reaction for SSH_REQUEST_CHANNEL_OPEN msg type
ssh_string pubkey = NULL;
char *pk64 = NULL;
int signature_state = SSH_PUBLICKEY_STATE_NONE;
//ctx->channel = 0;
//ctx->shell = 0;
if(!message)
return 0;
printf("\n message received = %d", ssh_message_type(message));
//if(!ctx->bAuthenticated)
{
switch(ssh_message_type(message))
{
case SSH_REQUEST_AUTH:
{
int iSubType = ssh_message_subtype(message);
switch(ssh_message_subtype(message))
{
case SSH_AUTH_METHOD_NONE:
ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_PASSWORD);
ssh_message_reply_default(message);
break;
case SSH_AUTH_METHOD_PUBLICKEY:
pubkey = publickey_to_string(ssh_message_auth_publickey(message));
//pk64 = g_base64_encode((const guchar *)ssh_string_to_char(pubkey), ssh_string_len(pubkey));
signature_state = ssh_message_auth_publickey_state(message);
if(signature_state == SSH_PUBLICKEY_STATE_NONE)
{
/* no signature */
ssh_message_auth_reply_pk_ok_simple(message);
break;
}
else if(signature_state != SSH_PUBLICKEY_STATE_VALID)
{
/* will be rejected later */
}
else
{
/* signature is good at that point */
if(pubkey_auth(pk64))
{
/* user is allowed */
ssh_message_auth_reply_success(message, 0);
//ssh_message_free(message);
return 1;
}
}
/* the following is not necessary if we want only pubkey auth */
ssh_message_auth_set_methods(message,SSH_AUTH_METHOD_PUBLICKEY);
/* reject authentication */
ssh_message_reply_default(message);
break;
case SSH_AUTH_METHOD_PASSWORD:
/* handle password auth if needed */
if(auth_password(ssh_message_auth_user(message), ssh_message_auth_password(message)))
{
ssh_message_auth_reply_success(message,0);
ctx->bAuthenticated = true;
//ssh_message_free(message);
//return 1;
}
break;
default:
ssh_message_auth_set_methods(message,SSH_AUTH_METHOD_PUBLICKEY);
ssh_message_reply_default(message);
//ssh_message_free(message);
break;
}
}
break;
case SSH_REQUEST_CHANNEL_OPEN:
{
int mn = ssh_message_subtype(message);
switch(mn)
{
case SSH_CHANNEL_SESSION:
{
ctx->channel = ssh_message_channel_request_open_reply_accept(message);
//ssh_message_free(message);
}
break;
default:
{
ssh_message_reply_default(message);
//ssh_message_free(message);
}
break;
}
}
break;
case SSH_REQUEST_CHANNEL:
{
int ity = ssh_message_subtype(message);
switch(ity)
{
case SSH_CHANNEL_REQUEST_SHELL:
{
ctx->shell = 1;
ssh_message_channel_request_reply_success(message);
}
break;
case SSH_CHANNEL_REQUEST_PTY:
ssh_message_channel_request_reply_success(message);
break;
default:
ssh_message_reply_default(message);
break;
}
}
break;
default:
ssh_message_reply_default(message);
//ssh_message_free(message);
break;
}
}
return 0;
}
void InitSets(SOCKET ListenSocket)
{
//Initialize
FD_ZERO(&g_ReadSet);
FD_ZERO(&g_WriteSet);
FD_ZERO(&g_ExceptSet);
//Assign the ListenSocket to Sets
FD_SET(ListenSocket, &g_ReadSet);
FD_SET(ListenSocket, &g_ExceptSet);
FD_SET(ListenSocket, &g_WriteSet);
}
int pubkey_auth(char* pk64)
{
char header[100],key[300],footer[100];
int ret = 0;
FILE *fp;
fp = fopen(AUTHORIZED_KEYS,"r");
if(fp == NULL)
{
fprintf(stderr,"\nCould not open authorized_keys file %s\n",AUTHORIZED_KEYS);
return 0;
}
while(fgetc(fp) != EOF)
{
header[0] = '\0';
key[0] = '\0';
footer[0] = '\0';
fscanf(fp,"%s %s %s\n",header,key,footer);
printf("\nkey = %s\n",key);
if(strcmp(pk64,key) == 0)
{
ret = 1;
break;
}
}
fclose(fp);
return ret;
}
int auth_password(const char *user, const char *password)
{
if(strcmp(user, SSHD_USER))
return 0;
if(strcmp(password, SSHD_PASSWORD))
return 0;
return 1; // authenticated
}
class cSessionData
{
public:
cSessionData(INT nSessionId = 0): m_nTxBytes(0), m_nRxBytes(0) {};
~cSessionData() {};
string m_strDataFromClient;
string m_strDataToClient;
INT m_nTxBytes;
INT m_nRxBytes;
};
std::map<INT , cSessionData *> m_mapSessionData;
//int GetSshSessionAndChannel(void *Args);
CRITICAL_SECTION m_csRead;
CRITICAL_SECTION m_csProcess;
class CThread01
{
friend void *ThreadFunc01(void*);
protected:
enum
{
NOT_STARTED,
RUNNING,
FINISH_REQUESTED,
FINISHED
} m_stThread;
HANDLE m_hThread;
CRITICAL_SECTION m_csThread;
BOOL m_bTerminateUnresponsive;
virtual INT Body(void* args)
{
return 0;
}
public:
CThread01()
{
m_hThread = NULL;
m_stThread = NOT_STARTED;
InitializeCriticalSection(&m_csThread);
m_bTerminateUnresponsive = FALSE;
}
virtual ~CThread01(void)
{
}
INT Start(void* args);
INT Stop(void);
BOOL StopRequest(void);
};
void* ThreadFunc01(void* args)
{
void** p = (void**) args;
CThread01* pTh = (CThread01*) p[0];
EnterCriticalSection(&pTh->m_csThread);
pTh->m_stThread = pTh->RUNNING;
LeaveCriticalSection(&pTh->m_csThread);
pTh->Body(p[1]);
EnterCriticalSection(&pTh->m_csThread);
pTh->m_stThread = pTh->FINISHED;
LeaveCriticalSection(&pTh->m_csThread);
return ((void *) TRUE);
}
INT CThread01::Start(void *pThArgs)
{
INT nErr = 0;
unsigned int u32ThId;
void* pp[2] = {this, pThArgs};
LPTHREAD_START_ROUTINE pThFunc = (LPTHREAD_START_ROUTINE) ThreadFunc01;
if( (m_stThread == NOT_STARTED)
||(m_stThread == FINISHED)
)
{
m_stThread = NOT_STARTED;
EnterCriticalSection(&m_csThread);
m_hThread =CreateThread(
NULL, // LPSECURITY_ATTRIBUTES lpThreadAttributes,
// pointer to thread security attributes
0, // DWORD dwStackSize,
pThFunc,//(LPTHREAD_START_ROUTINE) SClkSrvThread,// pointer to thread function
pp, // argument for new thread
0, // DWORD dwCreationFlags,
(LPDWORD)&u32ThId// pointer to returned thread identifier
);
LeaveCriticalSection(&m_csThread);
if(m_hThread == NULL)
nErr = GetLastError();
if(!nErr)
{
while(m_stThread == NOT_STARTED)
Sleep(1);
}
}
if(nErr)
printf("Could not start CThread01");
return nErr;
}
INT CThread01::Stop(void)
{
INT nNumIterations;
nNumIterations = 0;
if(m_stThread == RUNNING)
{
m_stThread = FINISH_REQUESTED;
while(m_stThread != FINISHED)
{
Sleep(1);
nNumIterations++;
if ((nNumIterations>200))
{
TerminateThread(m_hThread, 0);
m_stThread = FINISHED;
}
}
}
CloseHandle(m_hThread);
m_hThread = NULL;
return 0;
}
BOOL CThread01::StopRequest(void)
{
return true;
}
class cSShService: public CThread01
{
public:
cSShService() { };
virtual INT Body(void* args);
virtual ~cSShService() { };
char* ReadData(INT ni);
char* WriteData(INT ni, char *pData);
};
INT cSShService::Body(void *pArgs)
{
bool bQuit = false;
while(true)
{
EnterCriticalSection(&m_csThread);
if(m_stThread == FINISH_REQUESTED)
bQuit = true;
LeaveCriticalSection(&m_csThread);
if(bQuit)
{
break;
}
INT nConCount = 0;
EnterCriticalSection(&m_csThread);
nConCount = m_mapSessionData.size();
LeaveCriticalSection(&m_csThread);
for (INT ni = 0; ni < nConCount; ni++)
{
char *pData = ReadData(ni);
if(pData)
{
int nCnt = strlen(pData);
if(nCnt > 0)
{
string strDt;
strDt.insert(0, pData, nCnt);
strDt += ("Session " + ni);
WriteData(ni, (char *)strDt.c_str());
strDt.clear();
}
}
}
Sleep(10);
}
return 0;
}
char* cSShService::ReadData(INT iIndex)
{
INT nConCount = 0;
char Data[255] = {0};
EnterCriticalSection(&m_csThread);
if(!m_mapSessionData[iIndex]->m_strDataFromClient.empty())
{
m_mapSessionData[iIndex]->m_strDataFromClient.copy(Data, 255);
m_mapSessionData[iIndex]->m_strDataFromClient.clear();
}
LeaveCriticalSection(&m_csThread);
return Data;
}
char* cSShService::WriteData(INT ni, char *pData)
{
int nSize = strlen(pData);
EnterCriticalSection(&m_csThread);
m_mapSessionData[ni]->m_strDataToClient.insert(0, pData, nSize);
LeaveCriticalSection(&m_csThread);
return 0;
}
class cSShProtocol: public CThread01
{
public:
cSShProtocol(INT nSessionID = 0);
INT GetThreadState()
{
return m_stThread;
}
virtual INT Body(void* args);
virtual ~cSShProtocol();
/*typedef int (cSShProtocol::*pMsgcb)(ssh_session, ssh_message, void *);
pMsgcb cb_func;
void SetCbFunction(pMsgcb pfunptr);
void CallCbFunction(ssh_session, ssh_message, void *);
int message_callback(ssh_session session, ssh_message message, void *data);*/
cSessionData *pSessionData;
string m_strClientTxData;
string m_strClientRxData;
INT m_nTxBytes;
INT m_nRxBytes;
BOOL m_bConsole;
INT m_nSessionId;
};
cSShProtocol::cSShProtocol(INT nSessionID) : m_bConsole(FALSE), m_nTxBytes(0), m_nRxBytes(0), m_nSessionId(0)
{
EnterCriticalSection(&m_csThread);
m_mapSessionData[nSessionID] = new cSessionData();
LeaveCriticalSection(&m_csThread);
//pMsgcb = message_callback;
//SetCbFunction(cSShProtocol::message_callback);
//pSessionData = new cSessionData();
}
//void cSShProtocol::SetCbFunction(pMsgcb pfunptr)
//{
// cb_func = pfunptr;
//}
//void cSShProtocol::CallCbFunction(ssh_session session, ssh_message message, void *data)
//{
// (this->*cb_func)(session, message, data);
//}
INT cSShProtocol::Body(void *pArgs)
{
ssh_session session = (ssh_session)pArgs;
ssh_channel chan = 0;
ssh_message message;
int shell = 0;
int u32TestTimer = 0;
bool bQuit = false;
int verbosity = SSH_LOG_PACKET;
ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity );
//SOCKET sSock = ssh_get_fd(session);
if(ssh_handle_key_exchange(session))
{
printf("ssh_handle_key_exchange: %s\n",ssh_get_error(session));
return 3;
}
//ssh_bind_set_fd(sshbind, sSock);
Context ctx;
ctx.session = session;
ctx.channel = 0;
ctx.shell = 0;
ctx.bAuthenticated = false;
ssh_set_message_callback(session, message_callback, &ctx);
ssh_set_blocking(session, 0);
while(true)
{
InitSets(ssh_get_fd(session));
EnterCriticalSection(&m_csThread);
if(m_stThread == FINISH_REQUESTED)
bQuit = true;
LeaveCriticalSection(&m_csThread);
if(bQuit)
{
ssh_free(session);
break;
}
//if (select(0, &g_ReadSet, &g_WriteSet, &g_ExceptSet, 0) > 0)
{
ssh_execute_message_callbacks(session); // PROCESS ALL MESSAGES FROM THE QUEUE
/*if((ctx.bAuthenticated) && (!ctx.channel) && (!ctx.shell) )
{
do
{
message = ssh_message_get(session);//pCon->session);
if(message)
{
if(ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(message) == SSH_CHANNEL_SESSION)
{
ctx.channel = ssh_message_channel_request_open_reply_accept(message);
ssh_message_free(message);
break;
}
else
{
ssh_message_reply_default(message);
ssh_message_free(message);
}
}
else
{
break;
}
} while(!ctx.channel);
if(!ctx.channel)
{
printf("Error: cleint did not ask for a channel session (%s)\n", ssh_get_error(session));//pCon->session));
ssh_finalize();
return 1;
}
//Wait for a session from ssh client
do
{
message = ssh_message_get(session);//pCon->session);
if(message != NULL)
{
if(ssh_message_type(message) == SSH_REQUEST_CHANNEL)
{
if(ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL)
{
ctx.shell = 1;
ssh_message_channel_request_reply_success(message);
ssh_message_free(message);
break;
}
else if(ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_PTY)
{
ssh_message_channel_request_reply_success(message);
ssh_message_free(message);
continue;
}
}
ssh_message_reply_default(message);
ssh_message_free(message);
}
else
{
break;
}
} while(!ctx.shell);
if(!ctx.shell)
{
printf("Error: No shell requested (%s)\n", ssh_get_error(session));//pCon->session));
return 1;
}
}*/
int nRxBytes = 0;
string strInData;
if(( ctx.channel != 0 ) && (ctx.shell == 1) )
{
//while (ssh_channel_is_open(ctx.channel) && !ssh_channel_is_eof(ctx.channel))
if (ssh_channel_is_open(ctx.channel) && !ssh_channel_is_eof(ctx.channel))
{
bool bStatus = false;
EnterCriticalSection(&m_csThread);
if(m_stThread == FINISH_REQUESTED)
bStatus = true;
LeaveCriticalSection(&m_csThread);
if(bStatus)
{
ssh_channel_send_eof(ctx.channel);
ssh_channel_close(ctx.channel);
ssh_free(session);//pCon->session);
return 0;//break;
}
/*u32TestTimer++;
if(u32TestTimer >= 3000L)
{
u32TestTimer = 0;
if(ssh_handle_key_exchange(session))
{
printf("ssh_handle_key_exchange: %s\n",ssh_get_error(session));
return 3;
}
}*/
char pReadPt[255];
unsigned int iRxLen = 0;
int iBytes = ssh_channel_read_nonblocking(ctx.channel, pReadPt, 255, 0);
if(iBytes > 0)
{
strInData.insert(nRxBytes, pReadPt, iBytes);
nRxBytes += iBytes;
int iError = ssh_channel_write(ctx.channel, pReadPt, iBytes);
if(iError == -1)
printf("Error in writing SSH %s", ssh_get_error(session));//pCon->session));
}
else
{
if(iBytes < 0)
{
message = ssh_message_get(session);
int type = ssh_message_type(message);
int type1 = ssh_message_subtype(message);
printf("Client requested for close: BYtes are less than zero ");
char *cError = new char[255];
cError = (char *)ssh_get_error(session);
printf("\n Error = %s ", cError);
ssh_channel_send_eof(ctx.channel);
ssh_channel_close(ctx.channel);
ssh_free(session);//pCon->session);
EnterCriticalSection(&m_csThread);
Stop(); //Once the connection is closed , exit the thread
LeaveCriticalSection(&m_csThread);
break;
}
}
if(!strInData.empty())
{
std::size_t found = strInData.find('\r');
//Write Recieved data to buffer, so that main module picks up sent to DCU
if(found != std::string::npos)
{
char *pPtr1 = "\n";
int nSize = strlen(pPtr1);
int iError = ssh_channel_write(ctx.channel, pPtr1, iBytes);
if(iError == -1)
printf("Error in writing SSH %s", ssh_get_error(session));//pCon->session));
const char *pPtr = strInData.c_str();
int nLen = strInData.size();
EnterCriticalSection(&m_csThread);
m_mapSessionData[m_nSessionId]->m_strDataFromClient.insert(0, pPtr, nLen);
LeaveCriticalSection(&m_csThread);
strInData.clear();
nRxBytes = 0;
}
}
char Data[255] = {0};
int nc = 0;
EnterCriticalSection(&m_csThread);
if(!m_mapSessionData[m_nSessionId]->m_strDataToClient.empty())
{
nc = m_mapSessionData[m_nSessionId]->m_strDataToClient.size();
m_mapSessionData[m_nSessionId]->m_strDataToClient.copy(Data, 255);
m_mapSessionData[m_nSessionId]->m_strDataToClient.clear();
}
LeaveCriticalSection(&m_csThread);
//char *pData = Data;
if(nc)
{
//int nSize = strlen(pData);
int iError = ssh_channel_write(ctx.channel, Data, nc);
if(iError == -1)
printf("Error in writing SSH %s", ssh_get_error(session));//pCon->session));
}
Sleep(10);
}
}
/*if(( ctx.channel != 0 ) && (ctx.shell == 1) )
{
std::vector<char> buf(512, '\0');
if( ssh_channel_is_open(ctx.channel) && !ssh_channel_is_eof(ctx.channel) )
{
int num = ssh_channel_read(ctx.channel, &buf[0], buf.size(), 0);
if(num <= 0)
{
continue;
}
cout<<"Enter the SSH";
string str = string(&buf[0], num);
cout<<str.c_str()<< std::endl;
ssh_channel_write(ctx.channel, &buf[0], num);
}
}*/
}
} // while(true)
return 0;
}
cSShProtocol::~cSShProtocol()
{
}
std::list<cSShProtocol *> m_Clients;
int main(int argc, void *argv[])
{
ssh_bind sshbind; int auth=0; int r; int port = 2000; int verbosity = SSH_LOG_PACKET;
int session_count = 0; ssh_message message = 0; int shell=0;
char ptr1[9999] = "WELCOME TO ABB SSH SERVER \n"; int *ptr = (int *)malloc(4); unsigned int uTxLen = 0;
unsigned int uRxLen = 0; int iBytes = 0; int iError = -1; char *pReadPtr = (char *)malloc(255);
ssh_session session;
ssh_channel chan=0;
cSShService *pSshService = new cSShService();
pSshService->Start(NULL);
sshbind=ssh_bind_new();
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT,&port);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER "ssh_host_dsa_key");
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER "ssh_host_rsa_key");
if(ssh_bind_listen(sshbind)<0)
{
printf("Error listening to socket: %s\n",ssh_get_error(sshbind));
return 1;
}
int argc1 = argc;
char **argv1 = (char **)argv;
//ssh_options_getopt(session,&argc1,argv1);
int icon = 0;
while(true)
{
session = ssh_new();
r = ssh_bind_accept(sshbind,session);
if(r==SSH_ERROR)
{
printf("error accepting a connection : %s\n",ssh_get_error(sshbind));
return 2;
}
if(icon > 2)//if(!m_Clients.empty()) //if connections are more than 5 simply close the first one
{
cSShProtocol *pProtocolHandleLocal = m_Clients.front();
INT iThreadSts = pProtocolHandleLocal->GetThreadState();
if(iThreadSts == 1) //if thread state is running then only close
pProtocolHandleLocal->Stop();
delete pProtocolHandleLocal;
m_Clients.pop_front();
}
cSShProtocol *pProtocolHandle = new cSShProtocol(icon); //Loading the session
pProtocolHandle->Start(session);
m_Clients.push_back(pProtocolHandle);
icon++;
cout<<"Connection accepted:"<<icon<<endl;
session = NULL;
Sleep(1000);
}
return 0;
}
//
//struct Arguments
//{
// int argc;
// char *argv[10];
//}Args;
//
//std::list<cSShProtocol *> m_Clients;
//
//int main(int argc, char **argv)
//{
// HANDLE hThreadHandle = NULL;
// DWORD dwThreadId = -1;
// ssh_session session = NULL;
// ssh_channel chan = 0;
// ssh_bind sshbind = NULL;
// int cnt = 0;
//
// Arguments *Args = new Arguments();
// Args->argc = argc;
//
// for(int i = 0; i < argc; i++)
// Args->argv[i] = *argv;
//
// //GetSshSessionAndChannel(Args);
//
// InitializeCriticalSection(&m_csRead);
//
// hThreadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&GetSshSessionAndChannel, Args, 0, &dwThreadId);
//
// while(1)
// {
// //if(_kbhit())
// //{
//
// //}
// //EnterCriticalSection(&m_csRead);
// //if(!m_Clients.empty())
// //{
// //cnt = m_Clients.size();
// //if(cnt > 1)
// //{
// //ssh_channel_send_eof(m_Clients.front()->chan);
// //ssh_channel_close(m_Clients.front()->chan);
// //ssh_free(m_Clients.front()->session);
// //m_Clients.pop_front();
// //}
//
// //session = m_Clients.front()->session;
// //chan = m_Clients.front()->chan;
// //sshbind = m_Clients.front()->sshbind;
// //}
// //LeaveCriticalSection(&m_csRead);
//
//
// //if(!m_Clients.empty())
// //if(session != NULL && chan != NULL)
// //{
// /*if(m_Clients.size() > 1)
// {
// //ssh_channel_send_eof(m_Clients.front()->chan);
// ssh_channel_close(m_Clients.front()->chan);
// //ssh_free(m_Clients.front()->session);
// m_Clients.pop_front();
// }*/
//
// //if (ssh_channel_is_open(m_Clients.front()->chan) && !ssh_channel_is_eof(m_Clients.front()->chan))
// //if (ssh_channel_is_open(chan) && !ssh_channel_is_eof(chan))
// //{
// //char pReadPt[255];
// //unsigned int iRxLen = 0;
// //int iBytes = ssh_channel_read_nonblocking(chan, pReadPt, 255, 0);
// //if(iBytes > 0)
// //{
// //int iError = ssh_channel_write(chan, pReadPt, iBytes);
// //if(iError == -1)
// //printf("Error in writing SSH %s", ssh_get_error(session));
// //}
// //}
// //else
// //{
// //ssh_channel_close(chan);
// //ssh_free(session);
// //ssh_bind_free(sshbind);
// //ssh_finalize();
// //break;
// //}
// //}
//
// char input = NULL;
// bool bStatus = false;
// printf("I am in main thread\n");
// cout<<"Enter Q or q for 'Quit' ";
// cin>>input;
//
// if(input == 'q' || input == 'Q')
// {
// Sleep(500);
// TerminateThread(hThreadHandle, 0);
// bStatus = true;
// }
//
// Sleep(1000);
// if(bStatus)
// break;
// }
//
// return 0;
//}
//
//int GetSshSessionAndChannel(void *pArgs)
//{
// ssh_bind sshbind;
// int auth=0;
// int r;
// int port = 2000;
// int verbosity = SSH_LOG_PACKET;
// int session_count = 0;
// ssh_message message = 0;
// int shell=0;
// char ptr1[9999] = "WELCOME TO ABB SSH SERVER \n";//(char *) malloc(10);
// int *ptr = (int *)malloc(4);
// unsigned int uTxLen = 0;
// unsigned int uRxLen = 0;
// int iBytes = 0;
// int iError = -1;
// char *pReadPtr = (char *)malloc(255);
// ssh_session session;
// ssh_channel chan=0;
// Arguments *Args1 = (Arguments *)pArgs;
// //cConnection *pConnection;
//
// //g_thread_init(NULL);
//
// //ssh_threads_set_callbacks(ssh_threads_get_pthread());
// if(ssh_init() == -1)
// {
// printf("\nError initializing ssh: ssh_init() failed");
// exit(1);
// }
//
// sshbind=ssh_bind_new();
// //session = (ssh_session *) ssh_new();
// //session = ssh_new();
//
// ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT,&port);
// ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER "ssh_host_dsa_key");
// ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER "ssh_host_rsa_key");
//
// if(ssh_bind_listen(sshbind)<0)
// {
// printf("Error listening to socket: %s\n",ssh_get_error(sshbind));
// return 1;
// }
//
// while(1)
// {
// //session[session_count]=ssh_new();
// //ssh_options_getopt(session[session_count],&argc,argv);
// //r=ssh_bind_accept(sshbind,session[session_count]);
//
// session=ssh_new();
// int argc = Args1->argc;
// char **argv = Args1->argv;
// ssh_options_getopt(session,&argc,argv);
// r=ssh_bind_accept(sshbind,session);
// if(r==SSH_ERROR)
// {
// printf("error accepting a connection : %s\n",ssh_get_error(sshbind));
// return 2;
// }
//
// IN_ADDR *addr;
// SOCKET sSock = ssh_get_fd(session);
// SOCKADDR *pName = new SOCKADDR;
// int iLen = sizeof(SOCKADDR);
// int iErr = getpeername(sSock, pName, &iLen);
// addr = (IN_ADDR *)&pName->sa_data[2];
// char *ip = NULL;
//
// if(iErr != 0)
// printf("Error in reading");
// else
// {
// ip = inet_ntoa(*addr);
//
// printf("Socket Connected From %s\n", ip);
// //inet_addr(pName);
// //inet_ntop(AF_INET, &name.sin_addr, buf, sizeof buf);
// }
//
//
//
// //ssh_options_get(
//
// //pConnection = new cConnection();
// //ssh_options_set(session[session_count], SSH_OPTIONS_LOG_VERBOSITY, &verbosity );
// //ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity );
// //if(ssh_handle_key_exchange(session[session_count]))
// if(ssh_handle_key_exchange(session))
// {
// //printf("ssh_handle_key_exchange: %s\n",ssh_get_error(session[session_count]));
// printf("ssh_handle_key_exchange: %s\n",ssh_get_error(session));
// return 3;
// }
//
// /* public key authentication */
// //auth = authenticate_user(session[session_count]);
// auth = authenticate_user(session);
// if(!auth)
// {
// //printf("auth error: %s\n",ssh_get_error(session[session_count]));
// printf("auth error: %s\n",ssh_get_error(session));
// //ssh_disconnect(session[session_count]);
// ssh_disconnect(session);
// return 4;
// }
// //g_thread_create(server_thread,session[session_count],FALSE,NULL);
// session_count++;
//
// ////Wait for a session and channel request from client
// //do
// //{
// // message = ssh_message_get(session);
// // if(message)
// // {
// // if(ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(message) == SSH_CHANNEL_SESSION)
// // {
// // chan = ssh_message_channel_request_open_reply_accept(message);
// // ssh_message_free(message);
// // break;
// // }
// // else
// // {
// // ssh_message_reply_default(message);
// // ssh_message_free(message);
// // }
// // }
// // else
// // {
// // break;
// // }
// //} while(!chan);
// //
// //if(!chan)
// //{
// // printf("Error: cleint did not ask for a channel session (%s)\n", ssh_get_error(session));
// // ssh_finalize();
// // return 1;
// //}
//
// ////Wait for a session from ssh client
// //do
// //{
// // message = ssh_message_get(session);
// // if(message != NULL)
// // {
// // if(ssh_message_type(message) == SSH_REQUEST_CHANNEL)
// // {
// // if(ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL)
// // {
// // shell = 1;
// // ssh_message_channel_request_reply_success(message);
// // ssh_message_free(message);
// // break;
// // }
// // else if(ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_PTY)
// // {
// // ssh_message_channel_request_reply_success(message);
// // ssh_message_free(message);
// // continue;
// // }
// // }
// // ssh_message_reply_default(message);
// // ssh_message_free(message);
// // }
// // else
// // {
// // break;
// // }
// //} while(!shell);
// //
// //if(!shell)
// //{
// // printf("Error: No shell requested (%s)\n", ssh_get_error(session));
// // return 1;
// //}
//
// ////char *ClientReq = "Enter Password: ";
// ////CHAR ptr = 'a';
// ////unsigned char char1 = 'a';
// //uTxLen = strlen(ptr1);
// //iBytes = ssh_channel_write(chan, ptr1, uTxLen);
// //
// //if(iBytes < 0)
// // printf("Error: Channel write failed -- (%s)\n", ssh_get_error(session));
// //else
// //{
// // printf("Error: Channel write Successful -- (%s)\n");
// // //iError = ssh_channel_send_eof(chan);
// // //if(iError < 0)
// // //printf("Error: Channel write failed eof -- (%s)\n", ssh_get_error(session));
// //}
//
// if(session != NULL)
// {
// cSShProtocol *pPtr;
// if(!m_Clients.empty())
// {
// pPtr = m_Clients.front();
// pPtr->Stop();
// delete pPtr;
// m_Clients.pop_front();
// }
//
// }
//
// /*pConnection->sshbind = sshbind;
// pConnection->chan = chan;
// pConnection->session = session;
// pConnection->m_bChannelClosingRequest = false;*/
//
// //cSShProtocol *pProtocolHandle = new cSShProtocol(pConnection);
// cSShProtocol *pProtocolHandle = new cSShProtocol();
// m_Clients.push_back(pProtocolHandle);
// //pProtocolHandle->Start(pConnection);
// pProtocolHandle->Start(session);
//
//
// /*
// EnterCriticalSection(&m_csRead);
// m_Clients.push_back(pConnection);
// LeaveCriticalSection(&m_csRead);
// */
//
// /*while (ssh_channel_is_open(chan) && !ssh_channel_is_eof(chan))
// {
// char *pReadPt = (char *)malloc(255);
// unsigned int iRxLen = 0;
// iBytes = ssh_channel_read(chan, ptr1, uTxLen, 0);
// }*/
//
// session = NULL;
// chan = 0;
//
// Sleep(2000);
//
// }//While(1)
//
// return 0;
//}
| RE: SSH.dll crash problem | alvesfonseca@xxxxxxxxxxxx |
| FW: SSH.dll crash problem | Ravikumar Sunkari <Ravikumar.Sunkari@xxxxxxxxxxxxxx> |