--- utils/update-alternatives.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/utils/update-alternatives.c b/utils/update-alternatives.c
index 8a3bff1dd..982d1b954 100644
--- a/utils/update-alternatives.c
+++ b/utils/update-alternatives.c
@@ -51,6 +51,7 @@
#define PROGNAME "update-alternatives"
static const char *altdir ;
+static const char *altdir_as_prefix;
static const char *dpkg_root;
static const char *admdir;
@@ -1760,22 +1761,23 @@ static void
alternative_prepare_install_single(struct alternative *a, const char *name,
const char *linkname, const char *file)
{
- char *fntmp, *linktmp, *fn;
+ char *fntmp, *linktmp, *fn, *fnlink;
/* Create link in /etc/alternatives. */
fntmp = xasprintf("%s/%s" ALT_TMP_EXT, altdir, name);
fn = xasprintf("%s/%s", altdir, name);
+ fnlink = xasprintf("%s/%s", altdir_as_prefix, name);
checked_rm(fntmp);
checked_symlink(file, fntmp);
alternative_add_commit_op(a, OPCODE_MV, fntmp, fn);
free(fntmp);
linktmp = xasprintf("%s%s", dpkg_root, linkname);
- if (alternative_path_needs_update(linktmp, fn)) {
+ if (alternative_path_needs_update(linktmp, fnlink)) {
/* Create alternative link. */
fntmp = xasprintf("%s" ALT_TMP_EXT, linktmp);
checked_rm(fntmp);
- checked_symlink(fn, fntmp);
+ checked_symlink(fnlink, fntmp);
alternative_add_commit_op(a, OPCODE_MV, fntmp, linktmp);
free(fntmp);
}
@@ -1898,7 +1900,7 @@ alternative_has_broken_slave(struct slave_link *sl,
struct fileset *fs)
sl_altlnk = areadlink(sl->link);
if (!sl_altlnk)
return true;
- wanted = xasprintf("%s/%s", altdir, sl->name);
+ wanted = xasprintf("%s/%s", altdir_as_prefix, sl->name);
if (strcmp(sl_altlnk, wanted) != 0) {
free(wanted);
free(sl_altlnk);
@@ -1921,7 +1923,7 @@ alternative_has_broken_slave(struct slave_link *sl,
struct fileset *fs)
/* Slave link must not exist. */
if (alternative_path_classify(sl->link) != ALT_PATH_MISSING)
return true;
- sl_altlnk = xasprintf("%s/%s", altdir, sl->name);
+ sl_altlnk = xasprintf("%s/%s", altdir_as_prefix, sl->name);
if (alternative_path_classify(sl_altlnk) != ALT_PATH_MISSING) {
free(sl_altlnk);
return true;
@@ -1945,7 +1947,7 @@ alternative_needs_update(struct alternative *a)
altlnk = areadlink(a->master_link);
if (!altlnk)
return ALT_UPDATE_LINK_BROKEN;
- wanted = xasprintf("%s/%s", altdir, a->master_name);
+ wanted = xasprintf("%s/%s", altdir_as_prefix, a->master_name);
if (strcmp(altlnk, wanted) != 0) {
free(wanted);
free(altlnk);
@@ -2593,6 +2595,7 @@ main(int argc, char **argv)
admdir = admindir_init();
dpkg_root = dpkg_root_init();
altdir = altdir_init();
+ altdir_as_prefix = altdir + strlen(dpkg_root);
if (setvbuf(stdout, NULL, _IONBF, 0))
syserr("setvbuf failed");
@@ -2717,6 +2720,9 @@ main(int argc, char **argv)
if (MISSING_ARGS(1))
badusage(_("--%s needs a <directory>
argument"), "log");
altdir = argv[i + 1];
+ if (strlen(altdir) < strlen(dpkg_root) ||
memcmp(dpkg_root, altdir, strlen(dpkg_root)))
+ badusage(_("--%s needs to start with
DPKG_ROOT"), "log");
+ altdir_as_prefix = altdir + strlen(dpkg_root);
i++;
} else if (strcmp("--admindir", argv[i]) == 0) {
if (MISSING_ARGS(1))
--
2.13.3
signature.asc
Description: PGP signature

