mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
libkmipclient: Limit the nesting level of KMIP STRUCTURE recursion
KMIP STRUCTURE elements can be nested, which causes a recursion of functions kmip_decode_ttlv(), kmip_decode_xml(), and kmip_decode_json(). A malformed KMIP response may thus cause stack exhaustion. Limit the KMIP STRUCTURE nesting level to 32 levels. This is more than enough for currently defined KMIP responses. The practically used nesting level is 8 or 9, dependent on the type of KMIP response. Assisted-by: IBM Bob:2.0.0 Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com> Reviewed-by: Finn Callies <fcallies@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
committed by
Jan Höppner
parent
f0bf1985c3
commit
5fdeaab3d0
+10
-2
@@ -28,12 +28,16 @@
|
||||
* @param parent the parent node or NULL if no parent exists.
|
||||
* @param node On return: the decoded node.The newly allocated
|
||||
* node has a reference count of 1.
|
||||
* @param max_nesting_level the maximum nesting levels of structures within the
|
||||
* KMIP node. If the nesting level is reached, E2BIG
|
||||
* is returned.
|
||||
* @param debug if true, debug messages are printed
|
||||
*
|
||||
* @returns 0 in case of success, or a negative errno value
|
||||
*/
|
||||
int kmip_decode_xml(const xmlNode *xml, struct kmip_node *parent,
|
||||
struct kmip_node **node, bool debug)
|
||||
struct kmip_node **node, size_t max_nesting_level,
|
||||
bool debug)
|
||||
{
|
||||
char *tag_attr = NULL, *name_attr = NULL, *type_attr = NULL;
|
||||
enum kmip_tag tag, v1_attr_tag = 0;
|
||||
@@ -44,6 +48,9 @@ int kmip_decode_xml(const xmlNode *xml, struct kmip_node *parent,
|
||||
int64_t int64;
|
||||
int rc = 0, i;
|
||||
|
||||
if (max_nesting_level == 0)
|
||||
return -E2BIG;
|
||||
|
||||
if (xml == NULL || node == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -122,7 +129,8 @@ int kmip_decode_xml(const xmlNode *xml, struct kmip_node *parent,
|
||||
if (child->type != XML_ELEMENT_NODE)
|
||||
continue;
|
||||
|
||||
rc = kmip_decode_xml(child, n, &e, debug);
|
||||
rc = kmip_decode_xml(child, n, &e,
|
||||
max_nesting_level - 1, debug);
|
||||
if (rc != 0) {
|
||||
kmip_debug(debug, "Failed to parse child "
|
||||
"element %d", i);
|
||||
|
||||
Reference in New Issue
Block a user