In /usr/src/usr.sbin/inetd/parse.c, a linked list of file_list
structures is included.

When adding a config include file, realpath(3) is called:

parse.c:include_configs()
1193 
        new_file.abs = realpath(CONFIG, NULL);

new_file.abs is not tested against NULL, and the structure is
inconditionnally added to the list. But before returning:

1201
        free(new_file.abs);

the allocated buffer is freed (may be not NULL) but the member is not
reset to NULL.

Then in check_no_reinclude(), the list is walked down and this test
is made:

1314
        char *abs_path = realpath(glob_path, NULL);

1324,1325
        for (cur = file_list_head; cur != NULL; cur = cur->next) {
                if (strcmp(cur->abs, abs_path) == 0) {

So:
        - if realpath(3) failed, strcmp(3) is called against NULL;
        - if realpath(3) succeeded, the comparison is made with a location
that has been freed!

It may be that the alloc engine doesn't reuse a freed region, so it may
work (if realpath(3) succeeded...), but it seems to me there is
something wrong... Am I reading the source correctly?

And on a minor style note:

In check_no_reinclude(), cur is assigned at declaration, but is in fact
redefined (to the same value) in the for loop:

1310,1325
static bool
check_no_reinclude(const char *glob_path)
{
        struct file_list *cur = file_list_head;
        char *abs_path = realpath(glob_path, NULL);

        if (abs_path == NULL) {
                ERR("Error checking real path for '%s': %s",
                        glob_path, strerror(errno));
                return false;
        }

        DPRINTCONF("Absolute path '%s'", abs_path);

        for (cur = file_list_head; cur != NULL; cur = cur->next) {
                if (strcmp(cur->abs, abs_path) == 0) {

(abs_path is also assigned at declaration, but it is not redundant.)
-- 
        Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
                     http://www.kergis.com/
                    http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C

Reply via email to