aboutsummaryrefslogtreecommitdiff
path: root/lib/libufs
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2018-04-08 05:15:34 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2018-04-08 05:15:34 +0000
commit0c94b536568603bb1316072f3faace16e97ecc9a (patch)
treee1734ab84aaff09c6acf8e0c031e3163a68e163f /lib/libufs
parent3eeb75112272ef9ef244a00bc73beef3a146856a (diff)
Notes
Diffstat (limited to 'lib/libufs')
-rw-r--r--lib/libufs/inode.c16
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;