summaryrefslogtreecommitdiff
path: root/ufs
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2001-08-10 04:42:07 +0000
committerRoland McGrath <roland@gnu.org>2001-08-10 04:42:07 +0000
commit6da36980e09a2a8b1e7db0627be626aca884c797 (patch)
treef8d5c0f4d3b6cf5b2c5fdb43a0a0cbf807f6fa87 /ufs
parent9122c9ebc5b519302d86cc0532be9b4a9e0976dd (diff)
2001-08-09 Roland McGrath <roland@frob.com>
* inode.c (diskfs_get_translator): Fail with EFTYPE if the length field stored on disk is unreasonable. Don't crash on ENOMEM. Use memcpy instead of bcopy.
Diffstat (limited to 'ufs')
-rw-r--r--ufs/inode.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/ufs/inode.c b/ufs/inode.c
index 2647754c..28f18dbd 100644
--- a/ufs/inode.c
+++ b/ufs/inode.c
@@ -602,7 +602,7 @@ diskfs_get_translator (struct node *np, char **namep, u_int *namelen)
error_t err;
daddr_t blkno;
u_int datalen;
- void *transloc;
+ const void *transloc;
err = diskfs_catch_exception ();
if (err)
@@ -613,8 +613,15 @@ diskfs_get_translator (struct node *np, char **namep, u_int *namelen)
transloc = disk_image + fsaddr (sblock, blkno);
datalen = *(u_int *)transloc;
- *namep = malloc (datalen);
- bcopy (transloc + sizeof (u_int), *namep, datalen);
+ if (datalen > sblock->fs_bsize)
+ err = EFTYPE;
+ else
+ {
+ *namep = malloc (datalen);
+ if (*namep == NULL)
+ err = ENOMEM;
+ memcpy (*namep, transloc + sizeof (u_int), datalen);
+ }
diskfs_end_catch_exception ();