xf86drm: Fix error handling for drmGetDevices()

If the opendir() call in drmGetDevices() returns failure, we jump to an
error label that calls closedir() and then returns.  However this means
that we're calling closedir(NULL) which may not be safe on all
implementations.  We are also leaking the local_devices array that was
allocated before the opendir() call.

Fix both of these issues by jumping to an earlier error label (to free
local_devices) and guarding the closedir() call with a NULL test.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
[Emil Velikov: make the teardown symmetrical, remove the NULL check]
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
main
Matt Roper 2015-09-30 09:30:51 -07:00 committed by Emil Velikov
parent 4031dc17bb
commit 8c4a1cbd98
1 changed files with 5 additions and 5 deletions

View File

@ -3209,7 +3209,7 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
sysdir = opendir(DRM_DIR_NAME);
if (!sysdir) {
ret = -errno;
goto close_sysdir;
goto free_locals;
}
i = 0;
@ -3274,15 +3274,15 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
device_count++;
}
free(local_devices);
closedir(sysdir);
free(local_devices);
return device_count;
free_devices:
drmFreeDevices(local_devices, i);
free(local_devices);
close_sysdir:
closedir(sysdir);
free_locals:
free(local_devices);
return ret;
}