mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 02:49:32 +03:00
Linux: Fix big endian and partial read bugs in get_system_hostid()
Coverity made two complaints about this function. The first is that we ignore the number of bytes read. The second is that we have a sizeof mismatch. On 64-bit systems, long is a 64-bit type. Paradoxically, the standard says that hostid is 32-bit, yet is also a long type. On 64-bit big endian systems, reading into the long would cause us to return 0 as our hostid after the mask. This is wrong. Also, if a partial read were to happen (it should not), we would return a partial hostid, which is also wrong. We introduce a uint32_t system_hostid stack variable and ensure that the read is done into it and check the read's return value. Then we set the value based on whether the read was successful. This should fix both of coverity's complaints. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Neal Gompa <ngompa@datto.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #13968
This commit is contained in:
parent
ab32a14b2e
commit
72a366f018
@ -59,6 +59,7 @@ unsigned long
|
|||||||
get_system_hostid(void)
|
get_system_hostid(void)
|
||||||
{
|
{
|
||||||
unsigned long hostid = get_spl_hostid();
|
unsigned long hostid = get_spl_hostid();
|
||||||
|
uint32_t system_hostid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We do not use gethostid(3) because it can return a bogus ID,
|
* We do not use gethostid(3) because it can return a bogus ID,
|
||||||
@ -69,8 +70,11 @@ get_system_hostid(void)
|
|||||||
if (hostid == 0) {
|
if (hostid == 0) {
|
||||||
int fd = open("/etc/hostid", O_RDONLY | O_CLOEXEC);
|
int fd = open("/etc/hostid", O_RDONLY | O_CLOEXEC);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
if (read(fd, &hostid, 4) < 0)
|
if (read(fd, &system_hostid, sizeof (system_hostid))
|
||||||
|
!= sizeof (system_hostid))
|
||||||
hostid = 0;
|
hostid = 0;
|
||||||
|
else
|
||||||
|
hostid = system_hostid;
|
||||||
(void) close(fd);
|
(void) close(fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user