ID: 262 - 'set' segfaults when no IPMI inf present

Commit fixes segfault in 'set' sub-command when no IPMI interface is
present/available. This is caused by 'intf->session' being used without check
whether it's NULL or not which leads to NULL reference in printf().
This commit is contained in:
Zdenek Styblik 2013-07-18 03:20:10 +00:00
parent 8c5013b0ba
commit 85ff7dc46a

View File

@ -277,43 +277,74 @@ int ipmi_set_main(struct ipmi_intf * intf, int argc, char ** argv)
if (strncmp(argv[0], "host", 4) == 0 || if (strncmp(argv[0], "host", 4) == 0 ||
strncmp(argv[0], "hostname", 8) == 0) { strncmp(argv[0], "hostname", 8) == 0) {
ipmi_intf_session_set_hostname(intf, argv[1]); ipmi_intf_session_set_hostname(intf, argv[1]);
printf("Set session hostname to %s\n", intf->session->hostname); if (intf->session == NULL) {
lprintf(LOG_ERR, "Failed to set session hostname.");
return (-1);
}
printf("Set session hostname to %s\n",
intf->session->hostname);
} }
else if (strncmp(argv[0], "user", 4) == 0 || else if (strncmp(argv[0], "user", 4) == 0 ||
strncmp(argv[0], "username", 8) == 0) { strncmp(argv[0], "username", 8) == 0) {
ipmi_intf_session_set_username(intf, argv[1]); ipmi_intf_session_set_username(intf, argv[1]);
printf("Set session username to %s\n", intf->session->username); if (intf->session == NULL) {
lprintf(LOG_ERR, "Failed to set session username.");
return (-1);
}
printf("Set session username to %s\n",
intf->session->username);
} }
else if (strncmp(argv[0], "pass", 4) == 0 || else if (strncmp(argv[0], "pass", 4) == 0 ||
strncmp(argv[0], "password", 8) == 0) { strncmp(argv[0], "password", 8) == 0) {
ipmi_intf_session_set_password(intf, argv[1]); ipmi_intf_session_set_password(intf, argv[1]);
if (intf->session == NULL) {
lprintf(LOG_ERR, "Failed to set session password.");
return (-1);
}
printf("Set session password\n"); printf("Set session password\n");
} }
else if (strncmp(argv[0], "authtype", 8) == 0) { else if (strncmp(argv[0], "authtype", 8) == 0) {
int authtype; int authtype;
authtype = str2val(argv[1], ipmi_authtype_session_vals); authtype = str2val(argv[1], ipmi_authtype_session_vals);
if (authtype == 0xFF) { if (authtype == 0xFF) {
lprintf(LOG_ERR, "Invalid authtype: %s", argv[1]); lprintf(LOG_ERR, "Invalid authtype: %s",
} else { argv[1]);
ipmi_intf_session_set_authtype(intf, authtype); return (-1);
printf("Set session authtype to %s\n",
val2str(intf->session->authtype_set, ipmi_authtype_session_vals));
} }
ipmi_intf_session_set_authtype(intf, authtype);
if (intf->session == NULL) {
lprintf(LOG_ERR, "Failed to set session authtype.");
return (-1);
}
printf("Set session authtype to %s\n",
val2str(intf->session->authtype_set,
ipmi_authtype_session_vals));
} }
else if (strncmp(argv[0], "privlvl", 7) == 0) { else if (strncmp(argv[0], "privlvl", 7) == 0) {
int privlvl; int privlvl;
privlvl = str2val(argv[1], ipmi_privlvl_vals); privlvl = str2val(argv[1], ipmi_privlvl_vals);
if (privlvl == 0xFF) { if (privlvl == 0xFF) {
lprintf(LOG_ERR, "Invalid privilege level: %s", argv[1]); lprintf(LOG_ERR, "Invalid privilege level: %s",
} else { argv[1]);
ipmi_intf_session_set_privlvl(intf, privlvl); return (-1);
printf("Set session privilege level to %s\n",
val2str(intf->session->privlvl, ipmi_privlvl_vals));
} }
ipmi_intf_session_set_privlvl(intf, privlvl);
if (intf->session == NULL) {
lprintf(LOG_ERR,
"Failed to set session privilege level.");
return (-1);
}
printf("Set session privilege level to %s\n",
val2str(intf->session->privlvl,
ipmi_privlvl_vals));
} }
else if (strncmp(argv[0], "port", 4) == 0) { else if (strncmp(argv[0], "port", 4) == 0) {
int port = atoi(argv[1]); int port = atoi(argv[1]);
ipmi_intf_session_set_port(intf, port); ipmi_intf_session_set_port(intf, port);
if (intf->session == NULL) {
lprintf(LOG_ERR, "Failed to set session port.");
return (-1);
}
printf("Set session port to %d\n", intf->session->port); printf("Set session port to %d\n", intf->session->port);
} }
else if (strncmp(argv[0], "localaddr", 9) == 0) { else if (strncmp(argv[0], "localaddr", 9) == 0) {