Skip to content

Commit 762e3be

Browse files
lePicimichalvasko
authored andcommitted
session server BUGFIX missing XML namespace in rpc
Also refactor of nc_server_recv_rpc_io().
1 parent 174bc73 commit 762e3be

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

src/session_server.c

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,40 @@ recv_rpc_check_msgid(struct nc_session *session, const struct lyd_node *envp)
14001400
return NC_MSG_RPC;
14011401
}
14021402

1403+
/**
1404+
* @brief Prepare reply for rpc error.
1405+
*
1406+
* @param[in] session NETCONF session.
1407+
* @param[in] envp NETCONF-specific RPC envelope. Can be NULL.
1408+
* @return rpc-reply object or NULL.
1409+
*/
1410+
static struct nc_server_reply *
1411+
nc_server_prepare_rpc_err(struct nc_session *session, struct lyd_node *envp)
1412+
{
1413+
struct lyd_node *node;
1414+
const struct ly_err_item *ly_err;
1415+
1416+
if (!envp && (session->version != NC_VERSION_11)) {
1417+
return NULL;
1418+
}
1419+
1420+
ly_err = ly_err_last(session->ctx);
1421+
if (envp) {
1422+
/* at least the envelopes were parsed */
1423+
node = nc_err(session->ctx, NC_ERR_OP_FAILED, NC_ERR_TYPE_APP);
1424+
nc_err_set_msg(node, ly_err->msg, "en");
1425+
} else if (!strcmp("Missing XML namespace.", ly_err->msg)) {
1426+
node = nc_err(session->ctx, NC_ERR_MISSING_ATTR, NC_ERR_TYPE_RPC, "xmlns", "rpc");
1427+
nc_err_set_msg(node, ly_err->msg, "en");
1428+
} else {
1429+
/* completely malformed message, NETCONF version 1.1 defines sending error reply from
1430+
* the server (RFC 6241 sec. 3) */
1431+
node = nc_err(session->ctx, NC_ERR_MALFORMED_MSG);
1432+
}
1433+
1434+
return nc_server_reply_err(node);
1435+
}
1436+
14031437
/* should be called holding the session RPC lock! IO lock will be acquired as needed
14041438
* returns: NC_PSPOLL_ERROR,
14051439
* NC_PSPOLL_TIMEOUT,
@@ -1411,7 +1445,6 @@ nc_server_recv_rpc_io(struct nc_session *session, int io_timeout, struct nc_serv
14111445
{
14121446
struct ly_in *msg;
14131447
struct nc_server_reply *reply = NULL;
1414-
struct lyd_node *e;
14151448
int r, ret = 0;
14161449

14171450
NC_CHECK_ARG_RET(session, session, rpc, NC_PSPOLL_ERROR);
@@ -1448,22 +1481,12 @@ nc_server_recv_rpc_io(struct nc_session *session, int io_timeout, struct nc_serv
14481481
} else {
14491482
/* no message-id */
14501483
reply = nc_server_reply_err(nc_err(session->ctx, NC_ERR_MISSING_ATTR, NC_ERR_TYPE_RPC, "message-id", "rpc"));
1484+
ret = NC_PSPOLL_BAD_RPC;
14511485
}
14521486
} else {
14531487
/* bad RPC received */
1454-
if ((*rpc)->envp) {
1455-
/* at least the envelopes were parsed */
1456-
e = nc_err(session->ctx, NC_ERR_OP_FAILED, NC_ERR_TYPE_APP);
1457-
nc_err_set_msg(e, ly_err_last(session->ctx)->msg, "en");
1458-
reply = nc_server_reply_err(e);
1459-
} else if (session->version == NC_VERSION_11) {
1460-
/* completely malformed message, NETCONF version 1.1 defines sending error reply from
1461-
* the server (RFC 6241 sec. 3) */
1462-
reply = nc_server_reply_err(nc_err(session->ctx, NC_ERR_MALFORMED_MSG));
1463-
} else {
1464-
/* at least set the return value */
1465-
ret = NC_PSPOLL_BAD_RPC;
1466-
}
1488+
reply = nc_server_prepare_rpc_err(session, (*rpc)->envp);
1489+
ret = NC_PSPOLL_BAD_RPC;
14671490
}
14681491

14691492
cleanup:
@@ -1480,7 +1503,7 @@ nc_server_recv_rpc_io(struct nc_session *session, int io_timeout, struct nc_serv
14801503
}
14811504

14821505
/* bad RPC and an error reply sent */
1483-
ret = NC_PSPOLL_BAD_RPC | NC_PSPOLL_REPLY_ERROR;
1506+
ret |= NC_PSPOLL_REPLY_ERROR;
14841507
}
14851508

14861509
ly_in_free(msg, 1);

0 commit comments

Comments
 (0)