Module Name: src
Committed By: mlelstv
Date: Sat Dec 29 08:28:20 UTC 2012
Modified Files:
src/sbin/iscsid: iscsid_driverif.c iscsid_lists.c iscsid_main.c
iscsid_targets.c
Log Message:
Handle invalid messages more gracefully, handle sessions with no valid
connections, and be more verbose about errors.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sbin/iscsid/iscsid_driverif.c
cvs rdiff -u -r1.7 -r1.8 src/sbin/iscsid/iscsid_lists.c \
src/sbin/iscsid/iscsid_main.c
cvs rdiff -u -r1.4 -r1.5 src/sbin/iscsid/iscsid_targets.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/iscsid/iscsid_driverif.c
diff -u src/sbin/iscsid/iscsid_driverif.c:1.5 src/sbin/iscsid/iscsid_driverif.c:1.6
--- src/sbin/iscsid/iscsid_driverif.c:1.5 Sun May 27 20:05:04 2012
+++ src/sbin/iscsid/iscsid_driverif.c Sat Dec 29 08:28:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsid_driverif.c,v 1.5 2012/05/27 20:05:04 christos Exp $ */
+/* $NetBSD: iscsid_driverif.c,v 1.6 2012/12/29 08:28:20 mlelstv Exp $ */
/*-
* Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
@@ -559,7 +559,7 @@ event_recover_connection(uint32_t sid, u
serverAddress.sin_family = host->h_addrtype;
serverAddress.sin_port = htons((addr->port)
- ? addr->port : ISCSI_DEFAULT_PORT);
+ ? addr->port : ISCSI_DEFAULT_PORT);
serverAddress.sin_len = host->h_length;
memcpy(&serverAddress.sin_addr, host->h_addr_list[0], host->h_length);
@@ -927,13 +927,19 @@ event_handler(void *par)
rc = ioctl(driver, ISCSI_POLL_EVENT, &evtp);
else
rc = ioctl(driver, ISCSI_WAIT_EVENT, &evtp);
- if (rc || evtp.status)
+
+ if (rc != 0) {
+ perror("ioctl");
break;
+ }
DEB(1, ("Got Event: kind %d, status %d, sid %d, cid %d, reason %d\n",
evtp.event_kind, evtp.status, evtp.session_id,
evtp.connection_id, evtp.reason));
+ if (evtp.status)
+ break;
+
switch (evtp.event_kind) {
case ISCSI_SESSION_TERMINATED:
event_kill_session(evtp.session_id);
Index: src/sbin/iscsid/iscsid_lists.c
diff -u src/sbin/iscsid/iscsid_lists.c:1.7 src/sbin/iscsid/iscsid_lists.c:1.8
--- src/sbin/iscsid/iscsid_lists.c:1.7 Mon May 28 00:37:55 2012
+++ src/sbin/iscsid/iscsid_lists.c Sat Dec 29 08:28:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsid_lists.c,v 1.7 2012/05/28 00:37:55 riz Exp $ */
+/* $NetBSD: iscsid_lists.c,v 1.8 2012/12/29 08:28:20 mlelstv Exp $ */
/*-
* Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
@@ -543,10 +543,16 @@ get_session_list(iscsid_response_t ** pr
conn = (connection_t *)(void *)TAILQ_FIRST(&sess->connections);
ent->session_id = sess->entry.sid;
- ent->first_connection_id = conn->entry.sid.id;
ent->num_connections = sess->num_connections;
- ent->portal_id = conn->portal.sid.id;
- ent->initiator_id = conn->initiator_id;
+ if (conn) {
+ ent->first_connection_id = conn->entry.sid.id;
+ ent->portal_id = conn->portal.sid.id;
+ ent->initiator_id = conn->initiator_id;
+ } else {
+ ent->first_connection_id = 0;
+ ent->portal_id = 0;
+ ent->initiator_id = 0;
+ }
ent++;
}
UNLOCK_SESSIONS;
@@ -652,19 +658,29 @@ get_connection_info(iscsid_get_connectio
return;
}
- if (conn->initiator_id)
+ if (conn && conn->initiator_id)
init = find_initiator_id(conn->initiator_id);
res = (iscsid_get_connection_info_rsp_t *)(void *)rsp->parameter;
res->session_id = sess->entry.sid;
- res->connection_id = conn->entry.sid;
- res->target_portal_id = conn->portal.sid;
- res->target_portal = conn->portal.addr;
- strlcpy((char *)res->TargetName, (char *)conn->target.TargetName,
- sizeof(res->TargetName));
- strlcpy((char *)res->TargetAlias, (char *)conn->target.TargetAlias,
- sizeof(res->TargetAlias));
+ if (conn) {
+ res->connection_id = conn->entry.sid;
+ res->target_portal_id = conn->portal.sid;
+ res->target_portal = conn->portal.addr;
+ strlcpy((char *)res->TargetName, (char *)conn->target.TargetName,
+ sizeof(res->TargetName));
+ strlcpy((char *)res->TargetAlias, (char *)conn->target.TargetAlias,
+ sizeof(res->TargetAlias));
+ } else {
+ res->connection_id.id = 0;
+ res->connection_id.name[0] = '\0';
+ res->target_portal_id.id = 0;
+ res->target_portal_id.name[0] = '\0';
+ memset(&res->target_portal, 0, sizeof(res->target_portal));
+ memset(&res->TargetName, 0, sizeof(res->TargetName));
+ memset(&res->TargetAlias, 0, sizeof(res->TargetAlias));
+ }
if (init != NULL) {
res->initiator_id = init->entry.sid;
strlcpy((char *)res->initiator_address, (char *)init->address,
Index: src/sbin/iscsid/iscsid_main.c
diff -u src/sbin/iscsid/iscsid_main.c:1.7 src/sbin/iscsid/iscsid_main.c:1.8
--- src/sbin/iscsid/iscsid_main.c:1.7 Mon May 28 00:13:19 2012
+++ src/sbin/iscsid/iscsid_main.c Sat Dec 29 08:28:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsid_main.c,v 1.7 2012/05/28 00:13:19 riz Exp $ */
+/* $NetBSD: iscsid_main.c,v 1.8 2012/12/29 08:28:20 mlelstv Exp $ */
/*-
* Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
@@ -621,13 +621,19 @@ main(int argc, char **argv)
/* no return path? then we can't send a reply, */
/* so don't process the command */
if (!from.sun_path[0]) {
+ if (req_temp)
+ free(req);
DEBOUT(("No Return Address!\n"));
continue;
}
/* process the request */
process_message(req, &rsp, &rsp_temp);
- if (rsp == NULL)
- break;
+ if (rsp == NULL) {
+ if (req_temp)
+ free(req);
+ DEBOUT(("Invalid message!\n"));
+ continue;
+ }
DEB(98, ("Sending reply: status %d, len %d\n",
rsp->status, rsp->parameter_length));
Index: src/sbin/iscsid/iscsid_targets.c
diff -u src/sbin/iscsid/iscsid_targets.c:1.4 src/sbin/iscsid/iscsid_targets.c:1.5
--- src/sbin/iscsid/iscsid_targets.c:1.4 Sun May 27 16:50:32 2012
+++ src/sbin/iscsid/iscsid_targets.c Sat Dec 29 08:28:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsid_targets.c,v 1.4 2012/05/27 16:50:32 riz Exp $ */
+/* $NetBSD: iscsid_targets.c,v 1.5 2012/12/29 08:28:20 mlelstv Exp $ */
/*-
* Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
@@ -872,8 +872,7 @@ refresh_send_target(uint32_t id)
&addr, PORTAL_TYPE_SENDTARGET,
id);
} else {
- DEBOUT(("Syntax error in returned target address <%s>\n",
- tp));
+ DEBOUT(("Syntax error in returned target address <%s>\n", sp));
break;
}
}