[lxc-devel] [lxc/master] lxccontainer: fix lxc_config_item_is_supported

Drachenfels-GmbH on Github lxc-bot at linuxcontainers.org
Tue Oct 27 08:55:52 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 753 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20201027/4c746604/attachment.bin>
-------------- next part --------------
From 6eb516a793edd7c8e37472d00d1fc599f176bb97 Mon Sep 17 00:00:00 2001
From: Ruben Jenster <r.jenster at drachenfels.de>
Date: Fri, 23 Oct 2020 18:32:15 +0200
Subject: [PATCH] lxccontainer: fix lxc_config_item_is_supported

Use exact match instead of longest prefix match
to check whether a config item is supported.

Signed-off-by: Ruben Jenster <r.jenster at drachenfels.de>
---
 src/lxc/confile.c      | 12 ++++++++++++
 src/lxc/confile.h      |  3 +++
 src/lxc/lxccontainer.c |  2 +-
 src/tests/get_item.c   |  5 +++++
 4 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 75587d0ac8..08dd691667 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -278,6 +278,18 @@ static struct lxc_config_t config_jump_table[] = {
 
 static const size_t config_jump_table_size = sizeof(config_jump_table) / sizeof(struct lxc_config_t);
 
+struct lxc_config_t *lxc_get_config_exact(const char *key)
+{
+	size_t i;
+
+	for (i = 0; i < config_jump_table_size; i++)
+		if (!strcmp(config_jump_table[i].name, key))
+			return &config_jump_table[i];
+
+	return NULL;
+}
+
+
 struct lxc_config_t *lxc_get_config(const char *key)
 {
 	size_t i;
diff --git a/src/lxc/confile.h b/src/lxc/confile.h
index df80f639a3..68d50fc804 100644
--- a/src/lxc/confile.h
+++ b/src/lxc/confile.h
@@ -45,6 +45,9 @@ struct new_config_item {
 };
 
 /* Get the jump table entry for the given configuration key. */
+__hidden extern struct lxc_config_t *lxc_get_config_exact(const char *key);
+
+/* Get the jump table entry if entry name is a prefix of the given configuration key. */
 __hidden extern struct lxc_config_t *lxc_get_config(const char *key);
 
 /* List all available config items. */
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 673cf2483d..96aa372e1d 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -5749,7 +5749,7 @@ int list_all_containers(const char *lxcpath, char ***nret,
 
 bool lxc_config_item_is_supported(const char *key)
 {
-	return !!lxc_get_config(key);
+	return !!lxc_get_config_exact(key);
 }
 
 bool lxc_has_api_extension(const char *extension)
diff --git a/src/tests/get_item.c b/src/tests/get_item.c
index f2757c29d8..11db5f6738 100644
--- a/src/tests/get_item.c
+++ b/src/tests/get_item.c
@@ -600,6 +600,11 @@ int main(int argc, char *argv[])
 		goto out;
 	}
 
+	if (lxc_config_item_is_supported("lxc.arch.nonsense")) {
+		fprintf(stderr, "%d: failed to detect \"lxc.arch.nonsense\" as unsupported configuration item\n", __LINE__);
+		goto out;
+	}
+
 	if (c->set_config_item(c, "lxc.notaconfigkey", "invalid")) {
 		fprintf(stderr, "%d: Managed to set \"lxc.notaconfigkey\"\n", __LINE__);
 		goto out;


More information about the lxc-devel mailing list