From deb9a4ed5d852c4e01c3811f30a521f52bbb2817 Mon Sep 17 00:00:00 2001 From: Zdenek Styblik Date: Fri, 17 Oct 2014 19:33:37 +0200 Subject: [PATCH] ID#277 - support for hostnames longer than 64 chars ID#313 ipmitool doesn't support hostname long than 64 symbols ID#277 Minor issue with ipmi_intf_session_set_hostname() Commit adds support pretty much for FQDN not just up to the length of one label. This is achieved by change in in struct ipmi_session; and strdup() of user input. Of course, we have to free() this once we're done. --- include/ipmitool/ipmi_intf.h | 3 ++- src/plugins/ipmi_intf.c | 27 ++++++++++++++++++++------- src/plugins/lan/lan.c | 7 +------ src/plugins/lanplus/lanplus.c | 8 +------- src/plugins/serial/serial_basic.c | 7 +------ src/plugins/serial/serial_terminal.c | 7 +------ 6 files changed, 26 insertions(+), 33 deletions(-) diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h index 437a427..f9f6592 100644 --- a/include/ipmitool/ipmi_intf.h +++ b/include/ipmitool/ipmi_intf.h @@ -63,7 +63,7 @@ enum LANPLUS_SESSION_STATE { #define IPMI_KG_BUFFER_SIZE 21 /* key plus null byte */ struct ipmi_session { - uint8_t hostname[64]; + char *hostname; /* Numeric IP adress or DNS name - see RFC 1034/RFC 1035 */ uint8_t username[17]; uint8_t authcode[IPMI_AUTHCODE_BUFFER_SIZE + 1]; uint8_t challenge[16]; @@ -213,6 +213,7 @@ void ipmi_intf_session_set_port(struct ipmi_intf * intf, int port); void ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype); void ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout); void ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry); +void ipmi_intf_session_cleanup(struct ipmi_intf *intf); void ipmi_cleanup(struct ipmi_intf * intf); #if defined(IPMI_INTF_LAN) || defined (IPMI_INTF_LANPLUS) diff --git a/src/plugins/ipmi_intf.c b/src/plugins/ipmi_intf.c index 0fa76be..a84237e 100644 --- a/src/plugins/ipmi_intf.c +++ b/src/plugins/ipmi_intf.c @@ -194,15 +194,14 @@ struct ipmi_intf * ipmi_intf_load(char * name) void ipmi_intf_session_set_hostname(struct ipmi_intf * intf, char * hostname) { - if (intf->session == NULL) + if (intf->session == NULL || hostname == NULL) { return; - - memset(intf->session->hostname, 0, 16); - - if (hostname != NULL) { - memcpy(intf->session->hostname, hostname, - __min(strlen(hostname), 64)); } + if (intf->session->hostname != NULL) { + free(intf->session->hostname); + intf->session->hostname = NULL; + } + intf->session->hostname = strdup(hostname); } void @@ -330,6 +329,20 @@ ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry) intf->session->retry = retry; } +void +ipmi_intf_session_cleanup(struct ipmi_intf *intf) +{ + if (intf->session == NULL) { + return; + } + if (intf->session->hostname != NULL) { + free(intf->session->hostname); + intf->session->hostname = NULL; + } + free(intf->session); + intf->session = NULL; +} + void ipmi_cleanup(struct ipmi_intf * intf) { diff --git a/src/plugins/lan/lan.c b/src/plugins/lan/lan.c index fb1a633..dd90706 100644 --- a/src/plugins/lan/lan.c +++ b/src/plugins/lan/lan.c @@ -2005,12 +2005,7 @@ ipmi_lan_close(struct ipmi_intf * intf) close(intf->fd); ipmi_req_clear_entries(); - - if (intf->session != NULL) { - free(intf->session); - intf->session = NULL; - } - + ipmi_intf_session_cleanup(intf); intf->opened = 0; intf->manufacturer_id = IPMI_OEM_UNKNOWN; intf = NULL; diff --git a/src/plugins/lanplus/lanplus.c b/src/plugins/lanplus/lanplus.c index 27b9610..0bff5b2 100644 --- a/src/plugins/lanplus/lanplus.c +++ b/src/plugins/lanplus/lanplus.c @@ -3291,12 +3291,7 @@ ipmi_lanplus_close(struct ipmi_intf * intf) close(intf->fd); ipmi_req_clear_entries(); - - if (intf->session) { - free(intf->session); - intf->session = NULL; - } - + ipmi_intf_session_cleanup(intf); intf->session = NULL; intf->opened = 0; intf->manufacturer_id = IPMI_OEM_UNKNOWN; @@ -3367,7 +3362,6 @@ ipmi_lanplus_open(struct ipmi_intf * intf) return -1; session = intf->session; - if (!session->port) session->port = IPMI_LANPLUS_PORT; if (!session->privlvl) diff --git a/src/plugins/serial/serial_basic.c b/src/plugins/serial/serial_basic.c index 5f4b926..871593f 100644 --- a/src/plugins/serial/serial_basic.c +++ b/src/plugins/serial/serial_basic.c @@ -305,12 +305,7 @@ serial_bm_close(struct ipmi_intf * intf) close(intf->fd); intf->fd = -1; } - - if (intf->session) { - free(intf->session); - intf->session = NULL; - } - + ipmi_intf_session_cleanup(intf); intf->opened = 0; } diff --git a/src/plugins/serial/serial_terminal.c b/src/plugins/serial/serial_terminal.c index 41d3753..34c6fc5 100644 --- a/src/plugins/serial/serial_terminal.c +++ b/src/plugins/serial/serial_terminal.c @@ -242,12 +242,7 @@ ipmi_serial_term_close(struct ipmi_intf * intf) close(intf->fd); intf->fd = -1; } - - if (intf->session) { - free(intf->session); - intf->session = NULL; - } - + ipmi_intf_session_cleanup(intf); intf->opened = 0; }