mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-27 13:21:11 +03:00
client: Fix ssh_send_banner() to confirm with RFC 4253
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
69
src/client.c
69
src/client.c
@@ -169,46 +169,75 @@ static int callback_receive_banner(const void *data, size_t len, void *user)
|
|||||||
*
|
*
|
||||||
* @return 0 on success, < 0 on error.
|
* @return 0 on success, < 0 on error.
|
||||||
*/
|
*/
|
||||||
int ssh_send_banner(ssh_session session, int server) {
|
int ssh_send_banner(ssh_session session, int server)
|
||||||
|
{
|
||||||
const char *banner = NULL;
|
const char *banner = NULL;
|
||||||
char buffer[128] = {0};
|
const char *terminator = NULL;
|
||||||
int err=SSH_ERROR;
|
/* The maximum banner length is 255 for SSH2 */
|
||||||
|
char buffer[256] = {0};
|
||||||
|
size_t len;
|
||||||
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
banner = session->version == 1 ? CLIENTBANNER1 : CLIENTBANNER2;
|
banner = session->version == 1 ? CLIENTBANNER1 : CLIENTBANNER2;
|
||||||
|
terminator = session->version == 1 ? "\n" : "\r\n";
|
||||||
|
|
||||||
if (server) {
|
if (server == 1) {
|
||||||
if(session->opts.custombanner == NULL){
|
if (session->opts.custombanner == NULL){
|
||||||
|
len = strlen(banner);
|
||||||
session->serverbanner = strdup(banner);
|
session->serverbanner = strdup(banner);
|
||||||
} else {
|
|
||||||
session->serverbanner = malloc(strlen(session->opts.custombanner) + 9);
|
|
||||||
if(!session->serverbanner)
|
|
||||||
goto end;
|
|
||||||
strcpy(session->serverbanner, "SSH-2.0-");
|
|
||||||
strcat(session->serverbanner, session->opts.custombanner);
|
|
||||||
}
|
|
||||||
if (session->serverbanner == NULL) {
|
if (session->serverbanner == NULL) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
snprintf(buffer, 128, "%s\n", session->serverbanner);
|
} else {
|
||||||
|
len = strlen(session->opts.custombanner);
|
||||||
|
session->serverbanner = malloc(len + 8 + 1);
|
||||||
|
if(session->serverbanner == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
snprintf(session->serverbanner,
|
||||||
|
len + 8 + 1,
|
||||||
|
"SSH-2.0-%s",
|
||||||
|
session->opts.custombanner);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buffer,
|
||||||
|
sizeof(buffer),
|
||||||
|
"%s%s",
|
||||||
|
session->serverbanner,
|
||||||
|
terminator);
|
||||||
} else {
|
} else {
|
||||||
session->clientbanner = strdup(banner);
|
session->clientbanner = strdup(banner);
|
||||||
if (session->clientbanner == NULL) {
|
if (session->clientbanner == NULL) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
snprintf(buffer, 128, "%s\n", session->clientbanner);
|
|
||||||
|
/* SSH version 1 has a banner length of 128 only */
|
||||||
|
len = session->version == 1 ? 128 : 0;
|
||||||
|
|
||||||
|
snprintf(buffer,
|
||||||
|
sizeof(buffer) - len,
|
||||||
|
"%s%s",
|
||||||
|
session->clientbanner,
|
||||||
|
terminator);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssh_socket_write(session->socket, buffer, strlen(buffer)) == SSH_ERROR) {
|
rc = ssh_socket_write(session->socket, buffer, strlen(buffer));
|
||||||
|
if (rc == SSH_ERROR) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
#ifdef WITH_PCAP
|
#ifdef WITH_PCAP
|
||||||
if(session->pcap_ctx)
|
if (session->pcap_ctx != NULL) {
|
||||||
ssh_pcap_context_write(session->pcap_ctx,SSH_PCAP_DIR_OUT,buffer,strlen(buffer),strlen(buffer));
|
ssh_pcap_context_write(session->pcap_ctx,
|
||||||
|
SSH_PCAP_DIR_OUT,
|
||||||
|
buffer,
|
||||||
|
strlen(buffer),
|
||||||
|
strlen(buffer));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
err=SSH_OK;
|
|
||||||
end:
|
|
||||||
|
|
||||||
return err;
|
rc = SSH_OK;
|
||||||
|
end:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @internal
|
/** @internal
|
||||||
|
|||||||
Reference in New Issue
Block a user