From c0dcf3238bb9341c03bdb7f73c1af1b3898de557 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 23 Oct 2009 06:06:46 -0600 Subject: 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 false positive. * 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 807d3c9c4..1e5108b2d 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='\' \ + 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 4f75c1919..197a8faec 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 d3e16d705..ae5491154 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 d44bd2739..11d73ce6c 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)) -- cgit v1.2.3-70-g09d2