[PATCH] dpkg: prevent important directories from being removed

Denys Vlasenko vda.linux at googlemail.com
Mon Jun 29 12:07:14 UTC 2020


Applied, thanks

On Fri, Feb 14, 2020 at 10:15 PM Norbert Lange <nolange79 at gmail.com> wrote:
>
> busybox will remove directory symlinks, which is at
> odds with common layouts that have some of
> bin/lib/lib32/lib64 symlinked.
>
> this adds a exludelist for critcal and often symlinked
> directories.
>
> Fixes: Bug 12551
>
> Signed-off-by: Norbert Lange <nolange79 at gmail.com>
> ---
>  archival/dpkg.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
>
> diff --git a/archival/dpkg.c b/archival/dpkg.c
> index da77fba05..0aeb363a9 100644
> --- a/archival/dpkg.c
> +++ b/archival/dpkg.c
> @@ -1204,6 +1204,26 @@ static char **create_list(const char *filename)
>         return file_list;
>  }
>
> +/** This tests if the filename is a base directory, which might be symlinked.
> + *  Debians dpkg test if directories are used by other packages, this
> + *  implementation doesn't and would remove for ex. an lib -> usr/lib symlink.
> + */
> +static int is_builtin_exclude(const char *name)
> +{
> +       if (*name++ != '/')
> +               return 0;
> +       if (is_prefixed_with(name, "usr/")) {
> +               name += sizeof("usr/") - 1;
> +               if (is_prefixed_with(name, "local/"))
> +                       name += sizeof("local/") - 1;
> +       } else if(index_in_strings(".\0" "etc\0" "opt\0" "srv\0" \
> +                       "var\0" "var/lib\0", name) >= 0)
> +               return 1;
> +
> +       return index_in_strings("bin\0" "lib\0" "lib32\0" "lib64\0" "sbin\0",
> +                       name) >= 0;
> +}
> +
>  /* maybe i should try and hook this into remove_file.c somehow */
>  static int remove_file_array(char **remove_names, char **exclude_names)
>  {
> @@ -1215,6 +1235,8 @@ static int remove_file_array(char **remove_names, char **exclude_names)
>                 return 0;
>         }
>         for (i = 0; remove_names[i] != NULL; i++) {
> +               if (is_builtin_exclude(remove_names[i]))
> +                       continue;
>                 if (exclude_names != NULL) {
>                         for (j = 0; exclude_names[j] != NULL; j++) {
>                                 if (strcmp(remove_names[i], exclude_names[j]) == 0) {
> --
> 2.25.0
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list