From 5bc1e22263da29a716575a856dd867c1f58f4a8b Mon Sep 17 00:00:00 2001 From: Albert Lee Date: Thu, 13 Feb 2014 04:06:16 -0500 Subject: [PATCH] 4553 ndmp_config_get_ext_list failed Reviewed by: Jan Kryl Reviewed by: Hans Rosenfeld Reviewed by: Dan McDonald Approved by: Garrett D'Amore --- usr/src/cmd/ndmpd/ndmp/ndmpd.h | 1 + usr/src/cmd/ndmpd/ndmp/ndmpd_config.c | 46 ++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/usr/src/cmd/ndmpd/ndmp/ndmpd.h b/usr/src/cmd/ndmpd/ndmp/ndmpd.h index 529ffa92d7..c2538f28c3 100644 --- a/usr/src/cmd/ndmpd/ndmp/ndmpd.h +++ b/usr/src/cmd/ndmpd/ndmp/ndmpd.h @@ -512,6 +512,7 @@ typedef struct ndmpd_session { /* * NDMP V4 related data */ + boolean_t ns_get_ext_list; boolean_t ns_set_ext_list; /* handling of hardlink, hardlink queue head */ diff --git a/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c b/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c index a411a5d7c5..d110dc0bce 100644 --- a/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c +++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c @@ -1051,15 +1051,23 @@ ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body) (void) memset((void*)&reply, 0, sizeof (reply)); - if (session->ns_set_ext_list == FALSE) + if (session->ns_set_ext_list) { + /* + * Illegal request if extensions have already been selected. + */ + NDMP_LOG(LOG_ERR, "Extensions have already been selected."); reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR; - else + } else { + /* + * Reply with an empty set of extensions. + */ + session->ns_get_ext_list = B_TRUE; reply.error = NDMP_NO_ERR; + } reply.class_list.class_list_val = NULL; reply.class_list.class_list_len = 0; - ndmp_send_reply(connection, (void *)&reply, "error sending ndmp_config_get_ext_list reply"); } @@ -1076,25 +1084,41 @@ ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body) * Returns: * void */ -/*ARGSUSED*/ void ndmpd_config_set_ext_list_v4(ndmp_connection_t *connection, void *body) { ndmp_config_set_ext_list_reply_v4 reply; + ndmp_config_set_ext_list_request_v4 *request; ndmpd_session_t *session = ndmp_get_client_data(connection); + request = (ndmp_config_set_ext_list_request_v4 *)body; + (void) memset((void*)&reply, 0, sizeof (reply)); - if (session->ns_set_ext_list == TRUE) { + + if (!session->ns_get_ext_list) { + /* + * The DMA is required to issue a NDMP_GET_EXT_LIST request + * prior sending a NDMP_SET_EXT_LIST request. + */ + NDMP_LOG(LOG_ERR, "No prior ndmp_config_get_ext_list issued."); + reply.error = NDMP_PRECONDITION_ERR; + } else if (session->ns_set_ext_list) { + /* + * Illegal request if extensions have already been selected. + */ + NDMP_LOG(LOG_ERR, "Extensions have already been selected."); reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR; } else { - session->ns_set_ext_list = TRUE; /* - * NOTE: for now we are not supporting any extension list, - * hence this error, when we start to support extensions, - * this should be validated + * We currently do not support any extensions, but the DMA + * may test NDMP_CONFIG_SET_EXT_LIST with an empty list. */ - - reply.error = NDMP_VERSION_NOT_SUPPORTED_ERR; + if (request->ndmp_selected_ext.ndmp_selected_ext_len != 0) { + reply.error = NDMP_CLASS_NOT_SUPPORTED_ERR; + } else { + session->ns_set_ext_list = B_TRUE; + reply.error = NDMP_NO_ERR; + } } ndmp_send_reply(connection, (void *)&reply, -- 2.11.4.GIT