Ignoring failures and altering behavior
Florian Weimer
fweimer@redhat.com
Wed Oct 17 11:19:00 GMT 2018
In many cases, glibc currently papers over resource allocation failures
by changing behavior. Some examples:
* If we cannot load a NSS service module with dlopen for any reason
(including malloc/mmap failures), we pretend that the service module
does not exist. NSS will possibly return different data as a result.
* If we cannot allocate memory for the gconv/iconv path, we will ignore
the user configuration and use a built-in path.
* If we cannot open /etc/host.conf for any reason, we do not report an
error and pretend that the file does not exist, possibly altering
name resolution results.
* If we get a read error indicating file system corruption or
unavailability for a directory in the dynamic linker, we ignore that
directory.
I'm sure there are many more examples.
File system errors can be quite tricky. I used this code in one case to
tell persistent, possibly intended errors from actual problems:
FILE *fp = fopen (_PATH_RESCONF, "rce");
if (fp == NULL)
switch (errno)
{
case EACCES:
case EISDIR:
case ELOOP:
case ENOENT:
case ENOTDIR:
case EPERM:
/* Ignore these errors. They are persistent errors caused
by file system contents. */
break;
default:
/* Other errors refer to resource allocation problems and
need to be handled by the application. */
return NULL;
}
But I think there is a larger question here: Should we keep running at
all cost, possibly giving quite different results, or is it better to
actually report the errors we encounter and stop?
Thanks,
Florian
More information about the Libc-alpha
mailing list