summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1994-09-09 11:11:01 +0000
committerdfr <dfr@FreeBSD.org>1994-09-09 11:11:01 +0000
commit8e7267d0ad27e997e960e1713ecb2978f52bf940 (patch)
tree11e1907931568db42ca369145a988db150c08f84 /sys
parent07c3866a6e3d1bc84ae70e71b9dc5209d2c82321 (diff)
downloadFreeBSD-src-8e7267d0ad27e997e960e1713ecb2978f52bf940.zip
FreeBSD-src-8e7267d0ad27e997e960e1713ecb2978f52bf940.tar.gz
Fixed some confusion between the size of a logical block and the size of a
device block which was stopping symbolic links working. cd9660_readdir was incorrectly casting a pointer to the d_namlen field of a struct dirent to a (u_short*) which caused the directory entries "." and ".." to read incorrectly. Submitted by: dfr
Diffstat (limited to 'sys')
-rw-r--r--sys/fs/cd9660/cd9660_rrip.c4
-rw-r--r--sys/fs/cd9660/cd9660_vnops.c8
-rw-r--r--sys/fs/cd9660/iso.h5
-rw-r--r--sys/isofs/cd9660/cd9660_rrip.c4
-rw-r--r--sys/isofs/cd9660/cd9660_vnops.c8
-rw-r--r--sys/isofs/cd9660/iso.h5
6 files changed, 22 insertions, 12 deletions
diff --git a/sys/fs/cd9660/cd9660_rrip.c b/sys/fs/cd9660/cd9660_rrip.c
index 6d73374..78410a5 100644
--- a/sys/fs/cd9660/cd9660_rrip.c
+++ b/sys/fs/cd9660/cd9660_rrip.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_rrip.c 8.2 (Berkeley) 1/23/94
- * $Id$
+ * $Id: cd9660_rrip.c,v 1.2 1994/08/02 07:41:26 davidg Exp $
*/
#include <sys/param.h>
@@ -521,7 +521,7 @@ cd9660_rrip_loop(isodir,ana,table)
if (ana->iso_ce_blk >= ana->imp->volume_space_size
|| ana->iso_ce_off + ana->iso_ce_len > ana->imp->logical_block_size
|| bread(ana->imp->im_devvp,
- ana->iso_ce_blk * ana->imp->logical_block_size / DEV_BSIZE,
+ iso_lblktodaddr(ana->imp, ana->iso_ce_blk),
ana->imp->logical_block_size,NOCRED,&bp))
/* what to do now? */
break;
diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c
index 368a66d..2c913f2 100644
--- a/sys/fs/cd9660/cd9660_vnops.c
+++ b/sys/fs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.3 (Berkeley) 1/23/94
- * $Id: cd9660_vnops.c,v 1.3 1994/08/02 07:41:36 davidg Exp $
+ * $Id: cd9660_vnops.c,v 1.4 1994/08/08 09:11:18 davidg Exp $
*/
#include <sys/param.h>
@@ -479,6 +479,7 @@ cd9660_readdir(ap)
struct iso_mnt *imp;
struct iso_node *ip;
struct buf *bp = NULL;
+ u_short tmplen;
ip = VTOI(ap->a_vp);
imp = ip->i_mnt;
@@ -567,8 +568,9 @@ cd9660_readdir(ap)
switch (imp->iso_ftype) {
case ISO_FTYPE_RRIP:
cd9660_rrip_getname(ep,idp->current.d_name,
- (u_short *)&idp->current.d_namlen,
+ &tmplen,
&idp->current.d_fileno,imp);
+ idp->current.d_namlen = tmplen;
if (idp->current.d_namlen)
error = iso_uiodir(idp,&idp->current,idp->curroff);
break;
@@ -658,7 +660,7 @@ cd9660_readlink(ap)
* Get parents directory record block that this inode included.
*/
error = bread(imp->im_devvp,
- (daddr_t)(ip->i_number / DEV_BSIZE),
+ iso_dblkno(imp, ip->i_number),
imp->logical_block_size,
NOCRED,
&bp);
diff --git a/sys/fs/cd9660/iso.h b/sys/fs/cd9660/iso.h
index a329afa..04b9acc 100644
--- a/sys/fs/cd9660/iso.h
+++ b/sys/fs/cd9660/iso.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)iso.h 8.2 (Berkeley) 1/23/94
- * $Id$
+ * $Id: iso.h,v 1.2 1994/08/02 07:41:38 davidg Exp $
*/
#define ISODCL(from, to) (to - from + 1)
@@ -165,6 +165,9 @@ struct iso_mnt {
#define iso_lblkno(imp, loc) ((loc) >> (imp)->im_bshift)
#define iso_blksize(imp, ip, lbn) ((imp)->logical_block_size)
#define iso_lblktosize(imp, blk) ((blk) << (imp)->im_bshift)
+#define iso_lblktodaddr(imp, lbn) btodb(iso_lblktosize(imp, lbn))
+#define iso_dblkinc(imp, lbn) ((lbn) + iso_lblktodaddr(imp, 1))
+#define iso_dblkno(imp, loc) iso_lblktodaddr(imp, iso_lblkno(imp, loc))
int cd9660_mount __P((struct mount *,
char *, caddr_t, struct nameidata *, struct proc *));
diff --git a/sys/isofs/cd9660/cd9660_rrip.c b/sys/isofs/cd9660/cd9660_rrip.c
index 6d73374..78410a5 100644
--- a/sys/isofs/cd9660/cd9660_rrip.c
+++ b/sys/isofs/cd9660/cd9660_rrip.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_rrip.c 8.2 (Berkeley) 1/23/94
- * $Id$
+ * $Id: cd9660_rrip.c,v 1.2 1994/08/02 07:41:26 davidg Exp $
*/
#include <sys/param.h>
@@ -521,7 +521,7 @@ cd9660_rrip_loop(isodir,ana,table)
if (ana->iso_ce_blk >= ana->imp->volume_space_size
|| ana->iso_ce_off + ana->iso_ce_len > ana->imp->logical_block_size
|| bread(ana->imp->im_devvp,
- ana->iso_ce_blk * ana->imp->logical_block_size / DEV_BSIZE,
+ iso_lblktodaddr(ana->imp, ana->iso_ce_blk),
ana->imp->logical_block_size,NOCRED,&bp))
/* what to do now? */
break;
diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c
index 368a66d..2c913f2 100644
--- a/sys/isofs/cd9660/cd9660_vnops.c
+++ b/sys/isofs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.3 (Berkeley) 1/23/94
- * $Id: cd9660_vnops.c,v 1.3 1994/08/02 07:41:36 davidg Exp $
+ * $Id: cd9660_vnops.c,v 1.4 1994/08/08 09:11:18 davidg Exp $
*/
#include <sys/param.h>
@@ -479,6 +479,7 @@ cd9660_readdir(ap)
struct iso_mnt *imp;
struct iso_node *ip;
struct buf *bp = NULL;
+ u_short tmplen;
ip = VTOI(ap->a_vp);
imp = ip->i_mnt;
@@ -567,8 +568,9 @@ cd9660_readdir(ap)
switch (imp->iso_ftype) {
case ISO_FTYPE_RRIP:
cd9660_rrip_getname(ep,idp->current.d_name,
- (u_short *)&idp->current.d_namlen,
+ &tmplen,
&idp->current.d_fileno,imp);
+ idp->current.d_namlen = tmplen;
if (idp->current.d_namlen)
error = iso_uiodir(idp,&idp->current,idp->curroff);
break;
@@ -658,7 +660,7 @@ cd9660_readlink(ap)
* Get parents directory record block that this inode included.
*/
error = bread(imp->im_devvp,
- (daddr_t)(ip->i_number / DEV_BSIZE),
+ iso_dblkno(imp, ip->i_number),
imp->logical_block_size,
NOCRED,
&bp);
diff --git a/sys/isofs/cd9660/iso.h b/sys/isofs/cd9660/iso.h
index a329afa..04b9acc 100644
--- a/sys/isofs/cd9660/iso.h
+++ b/sys/isofs/cd9660/iso.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)iso.h 8.2 (Berkeley) 1/23/94
- * $Id$
+ * $Id: iso.h,v 1.2 1994/08/02 07:41:38 davidg Exp $
*/
#define ISODCL(from, to) (to - from + 1)
@@ -165,6 +165,9 @@ struct iso_mnt {
#define iso_lblkno(imp, loc) ((loc) >> (imp)->im_bshift)
#define iso_blksize(imp, ip, lbn) ((imp)->logical_block_size)
#define iso_lblktosize(imp, blk) ((blk) << (imp)->im_bshift)
+#define iso_lblktodaddr(imp, lbn) btodb(iso_lblktosize(imp, lbn))
+#define iso_dblkinc(imp, lbn) ((lbn) + iso_lblktodaddr(imp, 1))
+#define iso_dblkno(imp, loc) iso_lblktodaddr(imp, iso_lblkno(imp, loc))
int cd9660_mount __P((struct mount *,
char *, caddr_t, struct nameidata *, struct proc *));
OpenPOWER on IntegriCloud