From 1487b91809b1fa56f916092b2fd6d8dd53f5985e Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Tue, 2 Mar 2010 21:49:48 -0500 Subject: [PATCH] A fix for the RENAME command to handle targets and ambiguities. Damn I'm getting sloppy lately. --- src/commands.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/src/commands.c b/src/commands.c index 79b77fc6..b028b621 100644 --- a/src/commands.c +++ b/src/commands.c @@ -3316,6 +3316,7 @@ static gpg_error_t rename_command(assuan_context_t ctx, gchar *line) gpg_error_t rc; gchar **req, **src, *dst; xmlNodePtr n, ndst; + gboolean literal; rc = command_startup(ctx); @@ -3331,6 +3332,7 @@ static gpg_error_t rename_command(assuan_context_t ctx, gchar *line) } dst = req[1]; + literal = is_literal_element(&dst); if (!valid_xml_element((xmlChar *)dst)) { g_strfreev(req); @@ -3356,21 +3358,67 @@ static gpg_error_t rename_command(assuan_context_t ctx, gchar *line) if (!n) goto fail; - if (!src[1]) { - gchar **tmp = NULL; + /* To prevent unwanted effects: + * + * + * + * RENAME ab b + */ + if (xmlStrEqual(n->name, (xmlChar *)dst)) { + rc = GPG_ERR_AMBIGUOUS_NAME; + goto fail; + } - strv_printf(&tmp, "%s", dst); - ndst = find_root_element(client->doc, &tmp, &rc, NULL, 0, TRUE); - g_strfreev(tmp); + gchar **tmp = NULL; - if (!ndst && rc && rc != EPWMD_ELEMENT_NOT_FOUND) - goto fail; - else if (ndst) { - xmlUnlinkNode(ndst); - xmlFreeNodeList(ndst); + if (src[1]) { + gchar **p; + + for (p = src; *p; p++) { + if (!*(p+1)) + break; + + strv_printf(&tmp, "%s", *p); } } + strv_printf(&tmp, "%s%s", literal ? "!" : "", dst); + ndst = find_root_element(client->doc, &tmp, &rc, NULL, 0, FALSE); + + if (!ndst && rc && rc != EPWMD_ELEMENT_NOT_FOUND) { + g_strfreev(tmp); + goto fail; + } + + if (tmp[1] && ndst) + ndst = find_elements(client->doc, ndst->children, tmp+1, &rc, NULL, + NULL, NULL, FALSE, 0, NULL, FALSE); + + g_strfreev(tmp); + + if (!ndst && rc && rc != EPWMD_ELEMENT_NOT_FOUND) + goto fail; + + /* Target may exist: + * + * + * + * + * RENAME b a + * + * Would need to do: + * RENAME !b a + */ + if (ndst == n) { + rc = GPG_ERR_AMBIGUOUS_NAME; + goto fail; + } + + if (ndst) { + xmlUnlinkNode(ndst); + xmlFreeNodeList(ndst); + } + if (src[1]) xmlNodeSetName(n, (xmlChar *)dst); else -- 2.11.4.GIT