diff options
| author | Kirk McKusick <mckusick@FreeBSD.org> | 2018-04-08 05:15:34 +0000 |
|---|---|---|
| committer | Kirk McKusick <mckusick@FreeBSD.org> | 2018-04-08 05:15:34 +0000 |
| commit | 0c94b536568603bb1316072f3faace16e97ecc9a (patch) | |
| tree | e1734ab84aaff09c6acf8e0c031e3163a68e163f /lib/libufs | |
| parent | 3eeb75112272ef9ef244a00bc73beef3a146856a (diff) | |
Notes
Diffstat (limited to 'lib/libufs')
| -rw-r--r-- | lib/libufs/inode.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/libufs/inode.c b/lib/libufs/inode.c index 161b7cdbca5c..4011cbf2e945 100644 --- a/lib/libufs/inode.c +++ b/lib/libufs/inode.c @@ -60,6 +60,10 @@ getino(struct uufsd *disk, void **dino, ino_t inode, int *mode) ERROR(disk, NULL); fs = &disk->d_fs; + if (inode >= fs->fs_ipg * fs->fs_ncg) { + ERROR(disk, "inode number out of range"); + return (-1); + } inoblock = disk->d_inoblock; min = disk->d_inomin; max = disk->d_inomax; @@ -81,13 +85,17 @@ getino(struct uufsd *disk, void **dino, ino_t inode, int *mode) gotit: switch (disk->d_ufs) { case 1: dp1 = &((struct ufs1_dinode *)inoblock)[inode - min]; - *mode = dp1->di_mode & IFMT; - *dino = dp1; + if (mode != NULL) + *mode = dp1->di_mode & IFMT; + if (dino != NULL) + *dino = dp1; return (0); case 2: dp2 = &((struct ufs2_dinode *)inoblock)[inode - min]; - *mode = dp2->di_mode & IFMT; - *dino = dp2; + if (mode != NULL) + *mode = dp2->di_mode & IFMT; + if (dino != NULL) + *dino = dp2; return (0); default: break; |
