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