mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
node_device_driver.c: don't write beyond EOB for 4K-byte symlink
* src/node_device/node_device_driver.c (update_driver_name): The previous code would write one byte beyond the end of the 4KiB stack buffer when presented with a symlink value of exactly that length (very unlikely). Remove the automatic buffer and use virFileResolveLink in place of readlink. Suggested by Daniel Veillard.
This commit is contained in:
parent
042956d558
commit
b148318981
@ -78,10 +78,9 @@ static int update_driver_name(virConnectPtr conn,
|
||||
virNodeDeviceObjPtr dev)
|
||||
{
|
||||
char *driver_link = NULL;
|
||||
char devpath[PATH_MAX];
|
||||
char *devpath;
|
||||
char *p;
|
||||
int ret = -1;
|
||||
int n;
|
||||
|
||||
VIR_FREE(dev->def->driver);
|
||||
|
||||
@ -97,12 +96,11 @@ static int update_driver_name(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((n = readlink(driver_link, devpath, sizeof devpath)) < 0) {
|
||||
if (virFileResolveLink(driver_link, &devpath) < 0) {
|
||||
virReportSystemError(conn, errno,
|
||||
_("cannot resolve driver link %s"), driver_link);
|
||||
goto cleanup;
|
||||
}
|
||||
devpath[n] = '\0';
|
||||
|
||||
p = strrchr(devpath, '/');
|
||||
if (p) {
|
||||
@ -116,6 +114,7 @@ static int update_driver_name(virConnectPtr conn,
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(driver_link);
|
||||
free(devpath);
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user