tmpfs symlink size bug

Message ID 20011028103826.A17842@gondor.apana.org.au
State New, archived
Headers show
Series
  • tmpfs symlink size bug
Related show

Commit Message

Herbert Xu Oct. 27, 2001, 11:38 p.m. UTC
Since 2.4.12 the size of symlinks on tmpfs has been off by one.  The
following patch corrects that error.

Comments

Christoph Rohland Oct. 29, 2001, 8:49 a.m. UTC | #1
Hi Herbert,

On Sun, 28 Oct 2001, Herbert Xu wrote:
> Since 2.4.12 the size of symlinks on tmpfs has been off by one.  The
> following patch corrects that error.

Thanks for spotting. I prefer the following patch.

Alan, Linus, please apply.

Greetings
		Christoph

--- 2.4.13/mm/shmem.c	Sun Oct 28 16:59:03 2001
+++ t2.4.13/mm/shmem.c	Mon Oct 29 09:45:51 2001
@@ -1151,16 +1151,16 @@
 	if (error)
 		return error;
 
-	len = strlen(symname) + 1;
-	if (len > PAGE_CACHE_SIZE)
+	len = strlen(symname);
+	if (len >= PAGE_CACHE_SIZE)
 		return -ENAMETOOLONG;
 		
 	inode = dentry->d_inode;
 	info = SHMEM_I(inode);
 	inode->i_size = len;
-	if (len <= sizeof(struct shmem_inode_info)) {
+	if (len < sizeof(struct shmem_inode_info)) {
 		/* do it inline */
-		memcpy(info, symname, len);
+		memcpy(info, symname, len + 1);
 		inode->i_op = &shmem_symlink_inline_operations;
 	} else {
 		spin_lock (&shmem_ilock);
@@ -1173,7 +1173,7 @@
 			return PTR_ERR(page);
 		}
 		kaddr = kmap(page);
-		memcpy(kaddr, symname, len);
+		memcpy(kaddr, symname, len + 1);
 		kunmap(page);
 		SetPageDirty(page);
 		UnlockPage(page);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Patch

Index: mm/shmem.c
===================================================================
RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.4/mm/shmem.c,v
retrieving revision 1.1.1.16
diff -u -r1.1.1.16 shmem.c
--- mm/shmem.c	17 Oct 2001 21:19:20 -0000	1.1.1.16
+++ mm/shmem.c	27 Oct 2001 23:34:51 -0000
@@ -1157,7 +1157,7 @@ 
 		
 	inode = dentry->d_inode;
 	info = SHMEM_I(inode);
-	inode->i_size = len;
+	inode->i_size = len - 1;
 	if (len <= sizeof(struct shmem_inode_info)) {
 		/* do it inline */
 		memcpy(info, symname, len);