@@ -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
14691492cleanup :
@@ -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