Bug#945828: update-mime-database does not check errors on readdir

Enrico Zini enrico at debian.org
Fri Nov 29 11:55:50 GMT 2019


Package: shared-mime-info
Version: 1.10-1
Severity: important

Hello,

thank you for maintaining shared-mime-info.

I am doing installation of an arch debian-based system in an arm chroot
from an amd64 system, as describe in here: https://www.enricozini.org/blog/2019/himblick/chroot-into-arm/

In such a setup, I observed that update-mime-database produces an empty
database without giving any error:

   # update-mime-database -V /usr/share/mime
   Updating MIME database in /usr/share/mime...
   
   Wrote 0 strings at 2c - 2c
   Wrote aliases at 2c - 30
   Wrote parents at 30 - 34
   Wrote literal globs at 34 - 38
   Wrote suffix globs at 38 - 40
   Wrote full globs at 40 - 44
   Wrote magic at 44 - 50
   Wrote namespace list at 50 - 54
   Wrote icons list at 54 - 58
   Wrote generic icons list at 58 - 5c
   Wrote types list at 5c - 60
   # ls -la /usr/share/mime/mime.cache 
   -rw-r--r-- 1 root root 96 Nov 29 12:50 /usr/share/mime/mime.cache

After some debugging, I pinpointed that readdir in scan_source_dir
returns an error, which gets silently ignored by update-mime-database.
This code:

    static void scan_source_dir(const char *path)
    {
            DIR *dir;
            struct dirent *ent;
            char *filename;
            GPtrArray *files;
            int i;
            gboolean have_override = FALSE;

            dir = opendir(path);
            if (!dir)
            {
                    perror("scan_source_dir");
                    exit(EXIT_FAILURE);
            }

            fprintf(stderr, "SSD opendir %s\n", path);

            files = g_ptr_array_new();
            while ((ent = readdir(dir)))
            {

should really use a loop like this to check for readdir's errors (see
readdir(3) manpage):

            while (1)
            {
                    errno = 0;
                    ent = readdir(dir);
                    if (!ent)
                    {
                            if (errno)
                            {
                                    perror("scan_source_dir");
                                    exit(EXIT_FAILURE);
                            } else {
                                    break;
                            }
                    }
                    ....


In the end, the cause of the issue I'm observing is much more exoteric:
https://bugs.launchpad.net/qemu/+bug/1805913
https://lkml.org/lkml/2018/12/27/155
but having update-mime-database correctly reporting the readdir errors
instead of silently ignoring them, would probably have helped me in
finding it much more easily.


Enrico


-- System Information:
Debian Release: 10.2
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.19.0-6-amd64 (SMP w/4 CPU cores)
Kernel taint flags: TAINT_WARN, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_IE.UTF-8, LC_CTYPE=en_IE.UTF-8 (charmap=UTF-8), LANGUAGE=en_IE:en (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages shared-mime-info depends on:
ii  libc6         2.28-10
ii  libglib2.0-0  2.58.3-2+deb10u2
ii  libxml2       2.9.4+dfsg1-7+b3

shared-mime-info recommends no packages.

shared-mime-info suggests no packages.

-- no debconf information



More information about the Pkg-freedesktop-maintainers mailing list