From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 6/6] libxl: prevent creation of domains with duplicate names Date: Thu, 27 Jan 2011 17:41:04 +0000 Message-ID: <1296150064-31991-7-git-send-email-ian.jackson@eu.citrix.com> References: <1296150064-31991-1-git-send-email-ian.jackson@eu.citrix.com> <1296150064-31991-2-git-send-email-ian.jackson@eu.citrix.com> <1296150064-31991-3-git-send-email-ian.jackson@eu.citrix.com> <1296150064-31991-4-git-send-email-ian.jackson@eu.citrix.com> <1296150064-31991-5-git-send-email-ian.jackson@eu.citrix.com> <1296150064-31991-6-git-send-email-ian.jackson@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1296150064-31991-6-git-send-email-ian.jackson@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: Ian Jackson , Ian Jackson List-Id: xen-devel@lists.xenproject.org libxl_domain_rename is where domain names are assigned. Therefore this is where we check that no two domains have the same name. As a special exception, domains whose name is "" are not considered to clash. We also take special care not to mind if we try to rename a domain to the name it already has. Signed-off-by: Ian Jackson --- tools/libxl/libxl.c | 22 ++++++++++++++++++++++ tools/libxl/libxl_create.c | 1 + 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index ccbc842..a88623a 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -141,6 +141,28 @@ int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid, } } + if (new_name[0]) { + /* nonempty names must be unique */ + uint32_t domid_e; + rc = libxl_name_to_domid(ctx, new_name, &domid_e); + if (rc == ERROR_INVAL) { + /* no such domain, good */ + } else if (rc != 0) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unexpected error" + "checking for existing domain"); + goto x_rc; + } else if (domid_e == domid) { + /* domain already has this name, ok (but we do still + * need the rest of the code as we may need to check + * old_name, for example). */ + } else { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "domain with name \"%s\"" + " already exists.", new_name); + rc = ERROR_INVAL; + goto x_rc; + } + } + if (old_name) { got_old_name = xs_read(ctx->xsh, trans, name_path, &got_old_len); if (!got_old_name) { diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 8aabc3c..f5a5cc4 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -350,6 +350,7 @@ int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info, retry_transaction: t = xs_transaction_start(ctx->xsh); + xs_rm(ctx->xsh, t, dom_path); xs_mkdir(ctx->xsh, t, dom_path); xs_set_permissions(ctx->xsh, t, dom_path, roperm, ARRAY_SIZE(roperm)); -- 1.5.6.5