From 59ed66b684de00c62803eda8c3182b8028a02e10 Mon Sep 17 00:00:00 2001 From: Jakub Jelen Date: Tue, 27 Jan 2026 21:38:57 +0100 Subject: [PATCH] New ssh_get_local_hostname() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jakub Jelen Reviewed-by: Pavol Žáčik Reviewed-by: Andreas Schneider --- include/libssh/misc.h | 1 + src/gssapi.c | 19 ++++++++++--------- src/kex-gss.c | 7 ++++--- src/legacy.c | 9 +++++---- src/misc.c | 17 +++++++++++++---- src/pki.c | 8 +++++--- 6 files changed, 38 insertions(+), 23 deletions(-) diff --git a/include/libssh/misc.h b/include/libssh/misc.h index d62afffd..ed2adbb5 100644 --- a/include/libssh/misc.h +++ b/include/libssh/misc.h @@ -45,6 +45,7 @@ extern "C" { /* gets the user home dir. */ char *ssh_get_user_home_dir(ssh_session session); char *ssh_get_local_username(void); +char *ssh_get_local_hostname(void); int ssh_file_readaccess_ok(const char *file); int ssh_dir_writeable(const char *path); diff --git a/src/gssapi.c b/src/gssapi.c index 696d1093..cf42bbec 100644 --- a/src/gssapi.c +++ b/src/gssapi.c @@ -198,7 +198,7 @@ int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n_oid, ssh_string *oids) { - char hostname[NI_MAXHOST] = {0}; + char *hostname = NULL; OM_uint32 maj_stat, min_stat; size_t i; gss_OID_set supported; /* oids supported by server */ @@ -210,14 +210,6 @@ ssh_gssapi_handle_userauth(ssh_session session, const char *user, int rc; char err_msg[SSH_ERRNO_MSG_MAX] = {0}; - rc = gethostname(hostname, 64); - if (rc != 0) { - SSH_LOG(SSH_LOG_TRACE, - "Error getting hostname: %s", - ssh_strerror(errno, err_msg, SSH_ERRNO_MSG_MAX)); - return SSH_ERROR; - } - /* Destroy earlier GSSAPI context if any */ ssh_gssapi_free(session); rc = ssh_gssapi_init(session); @@ -284,7 +276,16 @@ ssh_gssapi_handle_userauth(ssh_session session, const char *user, return SSH_OK; } + hostname = ssh_get_local_hostname(); + if (hostname == NULL) { + SSH_LOG(SSH_LOG_TRACE, + "Error getting hostname: %s", + ssh_strerror(errno, err_msg, SSH_ERRNO_MSG_MAX)); + return SSH_ERROR; + } + rc = ssh_gssapi_import_name(session->gssapi, hostname); + SAFE_FREE(hostname); if (rc != SSH_OK) { ssh_auth_reply_default(session, 0); gss_release_oid_set(&min_stat, &both_supported); diff --git a/src/kex-gss.c b/src/kex-gss.c index bb1c8dab..86ea55f6 100644 --- a/src/kex-gss.c +++ b/src/kex-gss.c @@ -421,7 +421,7 @@ int ssh_server_gss_kex_process_init(ssh_session session, ssh_buffer packet) gss_name_t client_name = GSS_C_NO_NAME; OM_uint32 ret_flags = 0; gss_buffer_desc mic = GSS_C_EMPTY_BUFFER, msg = GSS_C_EMPTY_BUFFER; - char hostname[NI_MAXHOST] = {0}; + char *hostname = NULL; char err_msg[SSH_ERRNO_MSG_MAX] = {0}; rc = ssh_buffer_unpack(packet, "S", &otoken); @@ -538,8 +538,8 @@ int ssh_server_gss_kex_process_init(ssh_session session, ssh_buffer packet) goto error; } - rc = gethostname(hostname, 64); - if (rc != 0) { + hostname = ssh_get_local_hostname(); + if (hostname == NULL) { SSH_LOG(SSH_LOG_TRACE, "Error getting hostname: %s", ssh_strerror(errno, err_msg, SSH_ERRNO_MSG_MAX)); @@ -547,6 +547,7 @@ int ssh_server_gss_kex_process_init(ssh_session session, ssh_buffer packet) } rc = ssh_gssapi_import_name(session->gssapi, hostname); + SAFE_FREE(hostname); if (rc != SSH_OK) { goto error; } diff --git a/src/legacy.c b/src/legacy.c index 65a47d6e..5fad635f 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -615,10 +615,10 @@ int ssh_publickey_to_file(ssh_session session, FILE *fp = NULL; char *user = NULL; char buffer[1024]; - char host[256]; + char *host = NULL; unsigned char *pubkey_64 = NULL; size_t len; - int rc; + if(session==NULL) return SSH_ERROR; if(file==NULL || pubkey==NULL){ @@ -636,8 +636,8 @@ int ssh_publickey_to_file(ssh_session session, return SSH_ERROR; } - rc = gethostname(host, sizeof(host)); - if (rc < 0) { + host = ssh_get_local_hostname(); + if (host == NULL) { SAFE_FREE(user); SAFE_FREE(pubkey_64); return SSH_ERROR; @@ -651,6 +651,7 @@ int ssh_publickey_to_file(ssh_session session, SAFE_FREE(pubkey_64); SAFE_FREE(user); + SAFE_FREE(host); SSH_LOG(SSH_LOG_RARE, "Trying to write public key file: %s", file); SSH_LOG(SSH_LOG_PACKET, "public key file content: %s", buffer); diff --git a/src/misc.c b/src/misc.c index ec9a51d2..a1b57790 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1233,6 +1233,18 @@ char *ssh_path_expand_tilde(const char *d) return r; } +char *ssh_get_local_hostname(void) +{ + char host[NI_MAXHOST] = {0}; + int rc; + + rc = gethostname(host, sizeof(host)); + if (rc != 0) { + return NULL; + } + return strdup(host); +} + /** @internal * @brief expands a string in function of session options * @param[in] s Format string to expand. Known parameters: @@ -1249,7 +1261,6 @@ char *ssh_path_expand_tilde(const char *d) */ char *ssh_path_expand_escape(ssh_session session, const char *s) { - char host[NI_MAXHOST] = {0}; char *buf = NULL; char *r = NULL; char *x = NULL; @@ -1313,9 +1324,7 @@ char *ssh_path_expand_escape(ssh_session session, const char *s) x = ssh_get_local_username(); break; case 'l': - if (gethostname(host, sizeof(host) == 0)) { - x = strdup(host); - } + x = ssh_get_local_hostname(); break; case 'h': if (session->opts.host) { diff --git a/src/pki.c b/src/pki.c index c6ab4a85..6fe0ff00 100644 --- a/src/pki.c +++ b/src/pki.c @@ -2684,7 +2684,7 @@ int ssh_pki_export_pubkey_file(const ssh_key key, const char *filename) { char key_buf[MAX_LINE_SIZE]; - char host[256]; + char *host = NULL; char *b64_key = NULL; char *user = NULL; FILE *fp = NULL; @@ -2699,8 +2699,8 @@ int ssh_pki_export_pubkey_file(const ssh_key key, return SSH_ERROR; } - rc = gethostname(host, sizeof(host)); - if (rc < 0) { + host = ssh_get_local_hostname(); + if (host == NULL) { free(user); return SSH_ERROR; } @@ -2708,6 +2708,7 @@ int ssh_pki_export_pubkey_file(const ssh_key key, rc = ssh_pki_export_pubkey_base64(key, &b64_key); if (rc < 0) { free(user); + free(host); return SSH_ERROR; } @@ -2718,6 +2719,7 @@ int ssh_pki_export_pubkey_file(const ssh_key key, user, host); free(user); + free(host); free(b64_key); if (rc < 0) { return SSH_ERROR;