[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: ssh_userauth_none crashes
[Thread Prev] | [Thread Next]
- Subject: RE: ssh_userauth_none crashes
- From: "Sruthi Mohan (RBEI/EIA1)" <Sruthi.Mohan@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Sun, 18 Oct 2015 02:06:06 +0000
- To: "libssh@xxxxxxxxxx" <libssh@xxxxxxxxxx>
HI, Attached files for SSH, Could be hempful if you could check From: Yang Yubo [mailto:yang@xxxxxxxxxxxx] Sent: Friday, October 16, 2015 6:43 PM To: libssh@xxxxxxxxxx Subject: Re: ssh_userauth_none crashes Hi Sruthi, I use libssh in one of my application, didn’t ever encounter such ssh_userauth_none crash error. It looks like some mySshSession was released or point to another memory address. I think it would be better if you could paste full example code that can reproduce the issue. Best Yang On Oct 16, 2015, at 18:59, Sruthi Mohan (RBEI/EIA1) <Sruthi.Mohan@xxxxxxxxxxxx<mailto:Sruthi.Mohan@xxxxxxxxxxxx>> wrote: Dear sir, I am using libssh 0.7 I have followed the following steps, ssh_connect(mySshSession);=succesful Known host verification ==successful ssh_userauth_none(mySshSession, NULL); ssh_userauth_none crashes with the error Heap block at 27415180 modified at 27415240 past requested size of b8. Any help would be appreciated Best regards Sruthi Mohan RBEI/EIA1 Tel. +91(80)6783-7826
/***************************************************************************************************
/**\file myipconnect.cpp
*
* \brief Implementation of the MyIpConnect class
*/
/***************************************************************************************************
* (c) Copyright by BOSCH REXROTH AG, all rights reserved *
****************************************************************************************************
*
* PROJECT: Spiderworks
*
* FILE VERSION INFORMATION:
* Revision: 1
* Date: 2015-june-16 17:00:00 IST
* Author: som5kor
*
* REVISION HISTORY:
*
* 1. som5kor : Implementaion of IpConnect
* 2.
*
***************************************************************************************************/
/**** include files ********************************************************************************
* List of include files needed in this module. */
#include "myipconnect.h"
QLoggingCategory network_category("s3.database");
/**************************************************************************************************
* FUNCTION: MYIpConnect
*/
/**\brief Constructor for MYIpConnect Class
* This is a default constructor , Initializes the private variables
*/
/*************************************************************************************************/
MYIpConnect::MYIpConnect()
{
port = 155;
access = O_WRONLY | O_CREAT | O_TRUNC;
PublickeyFile="DDM_login/ddm_key.pub";
PrivateKeyFile="DDM_login/rsa_key";
Passphrase = "N(wdZt3-f=k<=U4";
ConfigDestFile="/usr/local/S3/upload/myspider.zip";
ConfigSourceFile="DDM_Login/spider3config.zip";
DirectoryLocation="/usr/local/S3/upload";
User="s3ddm";
source=NULL;
if (CreateSSHSession()!=DDM_OK)
exit(1);
}
/**************************************************************************************************
* FUNCTION: CreateSFTPSession
*/
/**\brief CreateSFTPSession -Creates an SFTP session
* \return DDM_Result -returns the success/failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::CreateSFTPSession()
{try{
mySftpSession = sftp_new(mySshSession);
if (mySftpSession==NULL)
{
throw;
}
rc =sftp_init(mySftpSession);
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< "SFTP error : " + QString::fromStdString(e.what());
}
catch(...)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< Error_Map[E_SFTP];
return DDM_ERR;
}
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: GetDirectoryInfo
*/
/**\brief CreateSFTPSession-prints the constens of the directory to the console.
* \return void
*/
/*************************************************************************************************/
void MYIpConnect::GetDirectoryInfo()
{int err_code;
QString err_desc;
try{
dir = sftp_opendir(mySftpSession, DirectoryLocation.toStdString().c_str());
if (!dir)
{
err_code=SSH_ERROR;
err_desc="Error directory not opened: ";
}
qDebug() << "Name Size Perms Owner\tGroup";
while ((attributes = sftp_readdir(mySftpSession, dir)) != NULL)
{
qDebug() << attributes->name << (long long unsigned int) attributes->size << attributes->permissions << attributes->owner << attributes->uid << attributes->group << attributes->gid;
sftp_attributes_free(attributes);
}
if (!sftp_dir_eof(dir))
{
sftp_closedir(dir);
err_code=SSH_ERROR;
err_desc="Error can't list directory: ";
throw;
}
rc = sftp_closedir(dir);
if (rc != SSH_OK)
{
err_desc="Error can't close directory: ";
throw;
exit(rc);
}
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< QString::fromStdString(e.what());
}
catch(...)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<<err_desc+ssh_get_error(mySshSession);
exit(err_code);
}
}
/**************************************************************************************************
* FUNCTION: FreeSFTPsession
*/
/**\brief FreeSFTPsession-Frees the contents of SFTP session.
* \return void
*/
/*************************************************************************************************/
void MYIpConnect::FreeSFTPsession()
{ if (mySftpSession!=NULL)
sftp_free(mySftpSession);
}
/**************************************************************************************************
* FUNCTION: TransferConfigFile
*/
/**\brief TransferConfigFile-Transfer the config file to a given location in the device
* \return DDM_Result:success or failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::TransferConfigFile()
{ try{
char data[MAX_XFER_BUF_SIZE]={0};
int nwritten;
file = sftp_open(mySftpSession, ConfigDestFile.toStdString().c_str(),access,S_IRWXU);
if (file == NULL)
{
throw("Cannot open file for writing");// <<ssh_get_error(mySshSession);
}
source = fopen(ConfigSourceFile.toStdString().c_str(), "rb");
if(!source){
throw("Error Opening the file for reading");//<<ssh_get_error(mySshSession);
return DDM_ERR;
}
sftp_file_set_nonblocking(file) ;
while ((nwritten = fread(data, 1, MAX_XFER_BUF_SIZE, source))>0) {
if(sftp_write(file,data,nwritten)!=nwritten){
qDebug()<<"Error writing to file "<<ssh_get_error(mySshSession);
return DDM_ERR;
}
}
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< QString::fromStdString(e.what());
}
catch(QString err_desc)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< err_desc;
return DDM_ERR;
}
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: CreateSSHSession
*/
/**\brief CreateSSHSession-Creates an SSh session
* \return DDM_Result:success or failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::CreateSSHSession()
{
try{
mySshSession = ssh_new();
if (mySshSession == NULL)
{
throw;
}
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< QString::fromStdString(e.what());
}
catch(...)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<<Error_Map[E_SSH];
return DDM_ERR;
}
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: ConnectToIP
*/
/**\brief ConnectToIP-Connects to give IP address
* \param IPAddress QString -IPAddress to be connected to
* \return DDM_Result:success or failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::ConnectToIP(QString IPAddress)
{
try{
qDebug()<<"IPCONNEct called"<<IPAddress;
ssh_options_set(mySshSession, SSH_OPTIONS_HOST, IPAddress.toStdString().c_str());
ssh_options_set(mySshSession, SSH_OPTIONS_PORT, &port);
ssh_options_set(mySshSession, SSH_OPTIONS_USER, User.toStdString().c_str());
rc = ssh_connect(mySshSession);
if (rc!=SSH_OK)
{
throw("Could not connect to IP :"+IPAddress+ssh_get_error(mySshSession));
}
if (VerifyKnownHosts()==DDM_ERR)
throw("Verification unsuccessful");
if(AuthenticatePublicPrivateKey()==DDM_ERR)
throw("Authentification unsuccesful");
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< QString::fromStdString(e.what());
}
catch(QString err_desc)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<<Error_Map[E_SSH_AUTH];
return DDM_ERR;
}
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: VerifyKnownHosts
*/
/**\brief VerifyKnownHosts-Cheks if the validity of the server. if the client is not previously
* added, adds it to known host
* \return DDM_Result:success or failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::VerifyKnownHosts()
{
int state, hlen;
unsigned char *hash = NULL;
char *hexa;
state = ssh_is_server_known(mySshSession);
hlen = ssh_get_pubkey_hash(mySshSession, &hash);
if (hlen < 0)
return DDM_ERR;
switch (state)
{
case SSH_SERVER_KNOWN_OK:
break; /* ok */
case SSH_SERVER_KNOWN_CHANGED:
qDebug() << "Host key for server changed: it is now:";
ssh_print_hexa("Public key hash", hash, hlen);
qDebug() << "For security reasons, connection will be stopped.";
free(hash);
return DDM_ERR;
case SSH_SERVER_FOUND_OTHER:
qDebug() << "The host key for this server was not found but an other type of key exists.";
qDebug() << "An attacker might change the default server key to confuse your client into thinking the key does not exist.";
free(hash);
return DDM_ERR;
case SSH_SERVER_FILE_NOT_FOUND:
qDebug() << "Could not find known host file.";
qDebug() << "If you accept the host key here, the file will be automatically created.";
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
return DDM_ERR;
case SSH_SERVER_NOT_KNOWN:
hexa = ssh_get_hexa(hash, hlen);
qDebug() << "The server is unknown.Writing to known hosts";
qDebug() << "Public key hash: " << hexa;
if (ssh_write_knownhost(mySshSession) < 0)
{
qDebug() << "Error " << strerror(errno);
free(hash);
return DDM_ERR ;
}
break;
case SSH_SERVER_ERROR:
qDebug() << "Error " << ssh_get_error(mySshSession);
free(hash);
return DDM_ERR;
}
free(hash);
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: AuthenticatePublicPrivateKey
*/
/**\brief VerifyKnownHosts-Cheks if the validity of the server. if the client is not previously
* added, adds it to known host
* \return DDM_Result:success or failure of the operation
*/
/*************************************************************************************************/
DDM_Result MYIpConnect::AuthenticatePublicPrivateKey()
{
QString err_desc;
try{
qDebug()<<"connected to host";
ssh_userauth_none(mySshSession, NULL);
if (ssh_pki_import_pubkey_file(PublickeyFile.toStdString().c_str(), &pubkey) != SSH_OK) {
throw("Failed to import the key");
}
if(ssh_userauth_try_publickey(mySshSession,User.toStdString().c_str(),pubkey)==SSH_ERROR)
return DDM_ERR;
if (ssh_pki_import_privkey_file(PrivateKeyFile.toStdString().c_str(), Passphrase.toStdString().c_str(), NULL, NULL, &privkey) !=SSH_OK)
{
ssh_key_free(pubkey);
err_desc="Failed to import Private key from file"+PrivateKeyFile;
throw;
}
rc = ssh_userauth_publickey(mySshSession, NULL, privkey);
if (rc == SSH_AUTH_ERROR) {
err_desc="Authentication failure Error";
throw;
}
if (rc == SSH_OK) {
qDebug()<<"Authentication Succesful";
}
}
catch(std::exception &e)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<< QString::fromStdString(e.what());
}
catch(...)
{
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).critical(network_category)<<Error_Map[E_SSH_AUTH]+","+err_desc+ssh_get_error(mySshSession);
return DDM_ERR;
}
return DDM_OK;
}
/**************************************************************************************************
* FUNCTION: DeleteAuthentication
*/
/**\brief DeleteAuthentication-Deletes the ssh session and the public private key created
*
* \Return void:
*/
/*************************************************************************************************/
void MYIpConnect::DeleteAuthentication()
{
if (mySshSession !=NULL)
{
ssh_disconnect(mySshSession);
ssh_free(mySshSession);
ssh_key_free(pubkey);
ssh_key_free(privkey);
}
}
/**************************************************************************************************
* FUNCTION: Destructor
*/
/**\brief Deletes the oblect and variables created in heap
*
* \Return void:
*/
/*************************************************************************************************/
MYIpConnect::~MYIpConnect()
{ DeleteAuthentication();
FreeSFTPsession();
}
/***************************************************************************************************
* *
* FILENAME: */
/**\file myipconnect.h
*
* \file myipconnect.h
* \brief Ip connection and file transfer handling class used in spider works
*
*/
/***************************************************************************************************
* (c) Copyright by BOSCH REXROTH AG, all rights reserved *
****************************************************************************************************
*
* PROJECT: SPIDERWORKS
*
* FILE VERSION INFORMATION:
* Revision: 1
* Date: 2015-June-16 12:00:00 IST
* Author: som5kor
*
* REVISION HISTORY:
*
* 1.som5kor:Supports SFTP of config file and connect to the device
*
***************************************************************************************************/
#ifndef MYIPCONNECT_H
#define MYIPCONNECT_H
/**** include files ********************************************************************************
* List of include files needed in this module. */
#include <QApplication>
#include<libssh/libssh.h>
#include<libssh/sftp.h>
#include <QDebug>
#include<QFile>
#include <direct.h>
#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <fstream>
#include <datatypes.h>
#include <QString>
#include <QtCore>
#include <QObject>
#include<networkinterface.h>
/*
* Buffersize for file transfer
*/
#define MAX_XFER_BUF_SIZE 16384
using namespace std;
/***************************************************************************************************
* Class used for Connecting to the device.Authentication is done using public private key checking
* uses libssh 0.7 dynamically linked library.
* Transfers files using SFTP.
***************************************************************************************************/
class MYIpConnect: public QObject ,public NetworkInterface
{
public:
MYIpConnect();
~MYIpConnect();
void sftp_cmmd();
/*Initialize SSH session*/
DDM_Result CreateSSHSession();
/*Tries Connecting to a given IP address*/
DDM_Result ConnectToIP(QString IPAddress);
DDM_Result VerifyKnownHosts();
DDM_Result AuthenticatePublicPrivateKey();
DDM_Result CreateSFTPSession();
void DeleteAuthentication();
void GetDirectoryInfo();
DDM_Result TransferConfigFile();
void FreeSFTPsession();
private:
QString PublickeyFile;
QString PrivateKeyFile;
QString Passphrase;
QString ConfigSourceFile;
QString ConfigDestFile;
QString User; //Device user
QString DirectoryLocation;
FILE *source;
int access; //file access
ssh_session mySshSession;
int rc ;
int port; //port for communicating with device
ssh_key pubkey;
ssh_key privkey;
sftp_dir dir; //destination directory where file has to be copied
sftp_attributes attributes;
sftp_session mySftpSession;
sftp_file file;
};
#endif // MYIPCONNECT_H
#ifndef DATATYPES_H
#define DATATYPES_H
#include <stdio.h>
enum DDM_Result { DDM_OK=0,
DDM_ERR};
#endif // DATATYPES_H
| Re: ssh_userauth_none crashes | Yang Yubo <yang@xxxxxxxxxxxx> |
| ssh_userauth_none crashes | "Sruthi Mohan (RBEI/EIA1)" <Sruthi.Mohan@xxxxxxxxxxxx> |
| Re: ssh_userauth_none crashes | Yang Yubo <yang@xxxxxxxxxxxx> |