---
 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

Attachment: signature.asc
Description: PGP signature

Reply via email to