lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:	Wed, 17 Aug 2011 16:47:41 +0900
From:	Kazuya Mio <k-mio@...jp.nec.com>
To:	ext4 <linux-ext4@...r.kernel.org>, Theodore Tso <tytso@....edu>
Subject: [PATCH v2 07/12] e4defrag: Allow user who can use reserved blocks
 to defrag

Fix free blocks check for general users to use the reserved blocks because
they can use reserved blocks in the following cases:
- the users are specified by mount option resuid/resgid
- e4defrag has CAP_SYS_RESOURCE capability

Signed-off-by: Kazuya Mio <k-mio@...jp.nec.com>
---
 misc/e4defrag.c |   37 +++++++------------------------------
 1 file changed, 7 insertions(+), 30 deletions(-)
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
index 2c998fd..3f39528 100644
--- a/misc/e4defrag.c
+++ b/misc/e4defrag.c
@@ -467,12 +467,15 @@ static int defrag_fadvise(int fd, struct move_extent defrag_data,
  * @fd:			defrag target file's descriptor.
  * @file:		file name.
  * @blk_count:		file blocks.
+ *
+ * Note that the users who cannot use the reserved blocks might pass this
+ * free space check though there is no free blocks except for reserved blocks.
+ * In this case, they can catch ENOSPC when donor file is created by fallocate
+ * in file_defrag(). So, it's no problem.
  */
 static int check_free_size(int fd, const char *file, ext4_fsblk_t blk_count)
 {
-	ext4_fsblk_t	free_blk_count;
 	struct statfs64	fsbuf;
-	uid_t		current_uid = getuid();
 
 	if (fstatfs64(fd, &fsbuf) < 0) {
 		if (mode_flag & DETAIL) {
@@ -483,16 +486,7 @@ static int check_free_size(int fd, const char *file, ext4_fsblk_t blk_count)
 		return -1;
 	}
 
-	/* Compute free space for root and normal user separately */
-	if (current_uid == ROOT_UID)
-		free_blk_count = fsbuf.f_bfree;
-	else
-		free_blk_count = fsbuf.f_bavail;
-
-	if (free_blk_count >= blk_count)
-		return 0;
-
-	return -ENOSPC;
+	return (fsbuf.f_bfree >= blk_count) ? 0 : -ENOSPC;
 }
 
 /*
@@ -764,23 +758,6 @@ static int get_exts_count(struct fiemap_extent_list *ext_list_head)
 	return ret;
 }
 
-/* get_file_blocks() -  Get total file blocks.
- *
- * @ext_list_head:	the extent list head of the target file
- */
-static ext4_fsblk_t get_file_blocks(struct fiemap_extent_list *ext_list_head)
-{
-	ext4_fsblk_t blk_count = 0;
-	struct fiemap_extent_list *ext_list_tmp = ext_list_head;
-
-	do {
-		blk_count += ext_list_tmp->data.len;
-		ext_list_tmp = ext_list_tmp->next;
-	} while (ext_list_tmp != ext_list_head);
-
-	return blk_count;
-}
-
 /*
  * free_ext() -		Free the extent list.
  *
@@ -1031,7 +1008,7 @@ static int file_defrag(const char *file, const struct stat64 *buf,
 	/* Count file fragments before defrag */
 	file_frags_start = get_exts_count(orig_list);
 
-	blk_count = get_file_blocks(orig_list);
+	blk_count = buf->st_blocks / (block_size / 512);
 	if (file_check(fd, file, file_frags_start, blk_count) < 0)
 		goto out;
 
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists