rmobj() is failing for _64 version of testcases, which use large
files, where it hits EOVERFLOW in lstat():

open12      0  TWARN  :  tst_tmpdir.c:206: tst_rmdir: rmobj(/tmp/opexIqjV3) 
failed:
       lstat(/tmp/opexIqjV3/large_file) failed; errno=75:
       Value too large for defined data type

Avoid using any *stat functions, instead try to open "obj"
with open(O_DIRECTORY | O_NOFOLLOW,..). If it succeeds,
we know we are dealing with directory, otherwise assume
it's a file or symlink.

Signed-off-by: Jan Stancek <jstan...@redhat.com>
---
 lib/rmobj.c |   15 +++++----------
 1 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/lib/rmobj.c b/lib/rmobj.c
index 9b6a643..9322fa9 100644
--- a/lib/rmobj.c
+++ b/lib/rmobj.c
@@ -84,6 +84,7 @@
 #include <limits.h>            /* for PATH_MAX */
 #include <sys/types.h>         /* for opendir(), readdir(), closedir(), stat() 
*/
 #include <sys/stat.h>          /* for [l]stat() */
+#include <fcntl.h>
 #include <dirent.h>            /* for opendir(), readdir(), closedir() */
 #include <unistd.h>            /* for rmdir(), unlink() */
 #include "rmobj.h"
@@ -98,19 +99,13 @@ int rmobj(char *obj, char **errmsg)
        char dirobj[PATH_MAX];  /* object inside directory to modify */
        struct stat statbuf;    /* used to hold stat information */
        static char err_msg[1024];      /* error message */
+       int fd;
 
        /* Determine the file type */
-       if (lstat(obj, &statbuf) < 0) {
-               if (errmsg != NULL) {
-                       sprintf(err_msg, "lstat(%s) failed; errno=%d: %s",
-                               obj, errno, SYSERR);
-                       *errmsg = err_msg;
-               }
-               return -1;
-       }
 
-       /* Take appropriate action, depending on the file type */
-       if ((statbuf.st_mode & S_IFMT) == S_IFDIR) {
+       fd = open(obj, O_DIRECTORY | O_NOFOLLOW);
+       if (fd != -1) {
+               close(fd);
                /* object is a directory */
 
                /* Do NOT perform the request if the directory is "/" */
-- 
1.7.1


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to