bug-coreutils
[Top][All Lists]
Advanced

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

Re: stat(1) on Solaris 9


From: Eric Blake
Subject: Re: stat(1) on Solaris 9
Date: Fri, 23 Oct 2009 06:10:17 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090812 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Jim Meyering on 10/22/2009 4:14 AM:
>>> exposes the bug.  Why?  Because our replacement <sys/stat.h> declares stat
>>> as an object-like macro, but stat(1) had a usage pattern that hid rpl_stat
>>> from view and directly called the buggy stat.  OK to commit?
>> Good catch.  Please do.
>>
>>> Also, I'm reattaching the stdbuf readlink() cleanup patch from a few days
>>> ago; I've now tested it on Linux.  What file contains maintainer syntax
>>> checks to ensure we don't reintroduce raw '\breadlink(at)?' or 'stat :'?
>> cfg.mk is where I've been putting coreutils-specific syntax checks.
> 
> Here's part of it:
> 
>>From cbf36952d8c227aa5e46acf8643458a7fd51d473 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Thu, 22 Oct 2009 12:12:24 +0200
> Subject: [PATCH] build: prohibit direct use of readlink or readlinkat

How about this for the other part?

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkrhnSkACgkQ84KuGfSFAYCM+wCfdiui35vokUhehkI1QwBG6A+c
l84AnRKC1UjIh/QyednrYePnpQvdPnYb
=ogSa
-----END PGP SIGNATURE-----
>From efd1f7ff8c9531fede007e825c167995ec0eea68 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Fri, 23 Oct 2009 06:06:46 -0600
Subject: [PATCH] build: prohibit improper use of stat and lstat

* cfg.mk (sc_prohibit_stat_macro_address): New rule.
* src/ln.c (do_link): Adjust comment to avoid rule.
* src/stat.c (do_stat): Likewise.
* src/touch.c (main): Likewise.
---
 cfg.mk      |    6 ++++++
 src/ln.c    |    2 +-
 src/stat.c  |    2 +-
 src/touch.c |    2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/cfg.mk b/cfg.mk
index 807d3c9..79f8066 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -197,6 +197,12 @@ sc_prohibit_readlink:
        msg='do not use readlink(at); use via xreadlink or areadlink*'  \
          $(_prohibit_regexp)

+# Don't use address of "stat" or "lstat" functions
+sc_prohibit_stat_macro_address:
+       @re='stat '':|&l?stat\>'                                        \
+       msg='stat() and lstat() may be function-like macros'            \
+         $(_prohibit_regexp)
+
 # Ensure that date's --help output stays in sync with the info
 # documentation for GNU strftime.  The only exception is %N,
 # which date accepts but GNU strftime does not.
diff --git a/src/ln.c b/src/ln.c
index 4f75c19..197a8fa 100644
--- a/src/ln.c
+++ b/src/ln.c
@@ -138,7 +138,7 @@ do_link (const char *source, const char *dest)
     {
        /* Which stat to use depends on whether linkat will follow the
           symlink.  We can't use the shorter
-          (logical ? stat : lstat) (source, &source_stats)
+          (logical?stat:lstat) (source, &source_stats)
           since stat might be a function-like macro.  */
       if ((logical ? stat (source, &source_stats)
            : lstat (source, &source_stats))
diff --git a/src/stat.c b/src/stat.c
index d3e16d7..ae54911 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -903,7 +903,7 @@ do_stat (char const *filename, bool terse, char const 
*format)
         }
     }
   /* We can't use the shorter
-     (follow_links ? stat : lstat) (filename, &statbug)
+     (follow_links?stat:lstat) (filename, &statbug)
      since stat might be a function-like macro.  */
   else if ((follow_links
             ? stat (filename, &statbuf)
diff --git a/src/touch.c b/src/touch.c
index d44bd27..11d73ce 100644
--- a/src/touch.c
+++ b/src/touch.c
@@ -348,7 +348,7 @@ main (int argc, char **argv)
   if (use_ref)
     {
       struct stat ref_stats;
-      /* Don't use (no_dereference ? lstat : stat) (args), since stat
+      /* Don't use (no_dereference?lstat:stat) (args), since stat
          might be an object-like macro.  */
       if (no_dereference ? lstat (ref_file, &ref_stats)
           : stat (ref_file, &ref_stats))
-- 
1.6.5.rc1


reply via email to

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