bug-findutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #46815] problem when testing file size


From: anonymous
Subject: [bug #46815] problem when testing file size
Date: Tue, 05 Jan 2016 06:08:53 +0000
User-agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0

URL:
  <http://savannah.gnu.org/bugs/?46815>

                 Summary: problem when testing file size
                 Project: findutils
            Submitted by: None
            Submitted on: Di 05 Jan 2016 06:08:51 UTC
                Category: find
                Severity: 3 - Normal
              Item Group: None
                  Status: None
                 Privacy: Public
             Assigned to: None
         Originator Name: 
        Originator Email: address@hidden
             Open/Closed: Open
         Discussion Lock: Any
                 Release: None
           Fixed Release: None

    _______________________________________________________

Details:

Hi,

I noticed a strange behaviour in GNU find when testing the file
size. Let me explain the found problem with a small example:

$ dd if=/dev/zero of=foo.1k bs=1024 count=1
$ dd if=/dev/zero of=foo.24k bs=1024 count=24
$ dd if=/dev/zero of=foo.1M bs=1024 count=1024

$ # this should only find foo.1M:
$ find . -size 1M
.
./foo.24k
./foo.1k
./foo.1M

$ # this one works correctly:
$ find . -size 24k
./foo.24k

$ # all files less than 1M should be found but result is empty:
$ find . -size -1M

$ # all files are found:
$ find . -size -2M
.
./foo.24k
./foo.1k
./foo.1M

$ # a different unit also solves the issue:
$ find . -size -1024k
.
./foo.24k
./foo.1k

The problem is how pred_size() calculates the file size. When
searching for a file with a size of 1M and processing the test
files we created previously f_val is always 1:

f_val = ((1024 / 1048576)  + (1024 % 1048576 != 0))  = 1
f_val = ((24576 / 1048576) + (24576 % 1048576 != 0)) = 1
f_val = ((24576 / 1048576) + (24576 % 1048576 != 0)) = 1

I fixed the problem on my system by applying this patch:

diff --git a/find/pred.c b/find/pred.c
index d633ab9..73abbec 100644
--- a/find/pred.c
+++ b/find/pred.c
@@ -956,12 +956,12 @@ bool
 pred_size (const char *pathname, struct stat *stat_buf, struct predicate
*pred_ptr)
 {
   uintmax_t f_val;

   (void) pathname;
-  f_val = ((stat_buf->st_size / pred_ptr->args.size.blocksize)
-          + (stat_buf->st_size % pred_ptr->args.size.blocksize != 0));
+  f_val = stat_buf->st_size / pred_ptr->args.size.blocksize;
+
   switch (pred_ptr->args.size.kind)
     {
     case COMP_GT:
       if (f_val > pred_ptr->args.size.size)
        return (true);


Kind regards,

Sebastian




    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?46815>

_______________________________________________
  Nachricht gesendet von/durch Savannah
  http://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]