Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 460c54b7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6

* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6:
  [XFS] fix unaligned access in readdir
parents 5d0381e2 aea6ad0c
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -261,9 +261,9 @@ xfs_file_readdir(
#else

struct hack_dirent {
	int		namlen;
	loff_t		offset;
	u64		ino;
	loff_t		offset;
	int		namlen;
	unsigned int	d_type;
	char		name[];
};
@@ -285,8 +285,10 @@ xfs_hack_filldir(
{
	struct hack_callback *buf = __buf;
	struct hack_dirent *de = (struct hack_dirent *)(buf->dirent + buf->used);
	unsigned int reclen;

	if (buf->used + sizeof(struct hack_dirent) + namlen > buf->len)
	reclen = ALIGN(sizeof(struct hack_dirent) + namlen, sizeof(u64));
	if (buf->used + reclen > buf->len)
		return -EINVAL;

	de->namlen = namlen;
@@ -294,7 +296,7 @@ xfs_hack_filldir(
	de->ino = ino;
	de->d_type = d_type;
	memcpy(de->name, name, namlen);
	buf->used += sizeof(struct hack_dirent) + namlen;
	buf->used += reclen;
	return 0;
}

@@ -334,7 +336,8 @@ xfs_file_readdir(
		offset = filp->f_pos;

	while (!eof) {
		int reclen;
		unsigned int reclen;

		start_offset = offset;

		buf.used = 0;
@@ -355,7 +358,8 @@ xfs_file_readdir(
				goto done;
			}

			reclen = sizeof(struct hack_dirent) + de->namlen;
			reclen = ALIGN(sizeof(struct hack_dirent) + de->namlen,
				       sizeof(u64));
			size -= reclen;
			de = (struct hack_dirent *)((char *)de + reclen);
			curr_offset = de->offset /* & 0x7fffffff */;