]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
include/debug: don't print pointer address for SUID programs
authorKarel Zak <kzak@redhat.com>
Fri, 12 Jan 2018 10:01:26 +0000 (11:01 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 12 Jan 2018 10:01:26 +0000 (11:01 +0100)
* introduce new flag __UL_DEBUG_FL_NOADDR to suppress pointer address printing

* use __UL_DEBUG_FL_NOADDR when SUID

* move ul_debugobj() to debugobj.h, and require UL_DEBUG_CURRENT_MASK
  to provide access to the current mask from ul_debugobj(). It's better
  than modify all ul_debugobj() calls and use the global mask as
  argument.

* remove never used UL_DEBUG_DEFINE_FLAG

Reported-by: halfdog <me@halfdog.net>
Signed-off-by: Karel Zak <kzak@redhat.com>
include/Makemodule.am
include/debug.h
include/debugobj.h [new file with mode: 0644]
lib/loopdev.c
libblkid/src/blkidP.h
libfdisk/src/fdiskP.h
libmount/src/mountP.h
libsmartcols/src/smartcolsP.h
misc-utils/lsblk.c
misc-utils/whereis.c
sys-utils/lsns.c

index cfea1457c840ed0abae93c13fa9afb15628222f3..3e7f7a01efcba00c48ad02b6b3c3764b136e4604 100644 (file)
@@ -14,6 +14,7 @@ dist_noinst_HEADERS += \
        include/crc32.h \
        include/crc32c.h \
        include/debug.h \
+       include/debugobj.h \
        include/env.h \
        include/exec_shell.h \
        include/exitcodes.h \
index 97c0e1f086a6cd4c3a01a1c6c89b74c3855e238c..07a8dcb2a7cb337d2f078834453864b8e8137110 100644 (file)
@@ -49,11 +49,15 @@ struct ul_debug_maskname {
 #define UL_DEBUG_DEFINE_MASKNAMES(m) static const struct ul_debug_maskname m ## _masknames[]
 #define UL_DEBUG_MASKNAMES(m)  m ## _masknames
 
-#define UL_DEBUG_DEFINE_MASK(m) int m ## _debug_mask
+#define UL_DEBUG_MASK(m)         m ## _debug_mask
+#define UL_DEBUG_DEFINE_MASK(m)  int UL_DEBUG_MASK(m)
 #define UL_DEBUG_DECLARE_MASK(m) extern UL_DEBUG_DEFINE_MASK(m)
 
-/* p - flag prefix, m - flag postfix */
-#define UL_DEBUG_DEFINE_FLAG(p, m) p ## m
+/*
+ * Internal mask flags (above 0xffffff)
+ */
+#define __UL_DEBUG_FL_NOADDR   (1 << 24)       /* Don't print object address */
+
 
 /* l - library name, p - flag prefix, m - flag postfix, x - function */
 #define __UL_DBG(l, p, m, x) \
@@ -90,6 +94,10 @@ struct ul_debug_maskname {
                                lib ## _debug_mask = ul_debug_parse_envmask(lib ## _masknames, str); \
                } else \
                        lib ## _debug_mask = mask; \
+               if (lib ## _debug_mask) { \
+                       if (getuid() != geteuid() || getgid() != getegid()) \
+                               lib ## _debug_mask |= __UL_DEBUG_FL_NOADDR; \
+               } \
                lib ## _debug_mask |= pref ## INIT; \
        } while (0)
 
@@ -104,19 +112,6 @@ ul_debug(const char *mesg, ...)
        fputc('\n', stderr);
 }
 
-static inline void __attribute__ ((__format__ (__printf__, 2, 3)))
-ul_debugobj(const void *handler, const char *mesg, ...)
-{
-       va_list ap;
-
-       if (handler)
-               fprintf(stderr, "[%p]: ", handler);
-       va_start(ap, mesg);
-       vfprintf(stderr, mesg, ap);
-       va_end(ap);
-       fputc('\n', stderr);
-}
-
 static inline int ul_debug_parse_envmask(
                        const struct ul_debug_maskname flagnames[],
                        const char *mask)
diff --git a/include/debugobj.h b/include/debugobj.h
new file mode 100644 (file)
index 0000000..73b70b8
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef UTIL_LINUX_DEBUGOBJ_H
+#define UTIL_LINUX_DEBUGOBJ_H
+
+/*
+ * Include *after* debug.h and after UL_DEBUG_CURRENT_MASK define.
+ */
+
+static inline void __attribute__ ((__format__ (__printf__, 2, 3)))
+ul_debugobj(const void *handler, const char *mesg, ...)
+{
+       va_list ap;
+
+       if (handler && !(UL_DEBUG_CURRENT_MASK & __UL_DEBUG_FL_NOADDR))
+               fprintf(stderr, "[%p]: ", handler);
+
+       va_start(ap, mesg);
+       vfprintf(stderr, mesg, ap);
+       va_end(ap);
+       fputc('\n', stderr);
+}
+
+#endif /* UTIL_LINUX_DEBUGOBJ_H */
index 819aada3241917bb90b151bb788c960fd5b80921..7274f8480e2b0614dd7e0d59e97bbbd910c781d8 100644 (file)
@@ -57,6 +57,9 @@ UL_DEBUG_DEFINE_MASKNAMES(loopdev) = UL_DEBUG_EMPTY_MASKNAMES;
 #define DBG(m, x)       __UL_DBG(loopdev, LOOPDEV_DEBUG_, m, x)
 #define ON_DBG(m, x)    __UL_DBG_CALL(loopdev, LOOPDEV_DEBUG_, m, x)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(loopdev)
+#include "debugobj.h"
+
 static void loopdev_init_debug(void)
 {
        if (loopdev_debug_mask)
index 8108b0efab2c1145eb26c3e59b3a08946499cf13..22c9856312c1594d19dde8349f5dafce946672a1 100644 (file)
@@ -338,6 +338,9 @@ UL_DEBUG_DECLARE_MASK(libblkid);
 #define DBG(m, x)      __UL_DBG(libblkid, BLKID_DEBUG_, m, x)
 #define ON_DBG(m, x)    __UL_DBG_CALL(libblkid, BLKID_DEBUG_, m, x)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(libblkid)
+#include "debugobj.h"
+
 extern void blkid_debug_dump_dev(blkid_dev dev);
 
 
index 0b9d4341320994d1cb4e3912104fbc59c69f4652..e7c264edc46e2a8c99b700ed4b06f3a3907b21f6 100644 (file)
@@ -47,6 +47,9 @@ UL_DEBUG_DECLARE_MASK(libfdisk);
 #define ON_DBG(m, x)   __UL_DBG_CALL(libfdisk, LIBFDISK_DEBUG_, m, x)
 #define DBG_FLUSH      __UL_DBG_FLUSH(libfdisk, LIBFDISK_DEBUG_)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(libfdisk)
+#include "debugobj.h"
+
 /*
  * NLS -- the library has to be independent on main program, so define
  * UL_TEXTDOMAIN_EXPLICIT before you include nls.h.
index b00426d672c0701fe744aa8abb39d57fad009d69..d47d26442dff266f671e8cfbd18ae80e475cef1f 100644 (file)
@@ -50,6 +50,9 @@ UL_DEBUG_DECLARE_MASK(libmount);
 #define ON_DBG(m, x)   __UL_DBG_CALL(libmount, MNT_DEBUG_, m, x)
 #define DBG_FLUSH      __UL_DBG_FLUSH(libmount, MNT_DEBUG_)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(libmount)
+#include "debugobj.h"
+
 /*
  * NLS -- the library has to be independent on main program, so define
  * UL_TEXTDOMAIN_EXPLICIT before you include nls.h.
index b3b54cddd16f335e4f901bc40e03a989f4e7dd6b..510e7a9800f6ca28caf7565fe46695d5b802faf2 100644 (file)
@@ -36,6 +36,9 @@ UL_DEBUG_DECLARE_MASK(libsmartcols);
 #define ON_DBG(m, x)   __UL_DBG_CALL(libsmartcols, SCOLS_DEBUG_, m, x)
 #define DBG_FLUSH      __UL_DBG_FLUSH(libsmartcols, SCOLS_DEBUG_)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(libsmartcols)
+#include "debugobj.h"
+
 /*
  * Generic iterator
  */
index 9d3460b43c7c6d4de6ff09eb48f8bd80efa9871e..9e9f3cf815e46090eac0a1ae7c7513ca036f2b28 100644 (file)
@@ -75,6 +75,8 @@ UL_DEBUG_DEFINE_MASKNAMES(lsblk) = UL_DEBUG_EMPTY_MASKNAMES;
 #define DBG(m, x)       __UL_DBG(lsblk, LSBLK_DEBUG_, m, x)
 #define ON_DBG(m, x)    __UL_DBG_CALL(lsblk, LSBLK_DEBUG_, m, x)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(lsblk)
+#include "debugobj.h"
 
 #define LSBLK_EXIT_SOMEOK 64
 #define LSBLK_EXIT_ALLFAILED 32
index 0f583cc7a0bcd6e50ef1b77894f61c378d1b8ce3..c6bf2fa4bdcffa6d8195d8113fe777b73fe59eb3 100644 (file)
@@ -72,6 +72,9 @@ UL_DEBUG_DEFINE_MASKNAMES(whereis) = UL_DEBUG_EMPTY_MASKNAMES;
 #define DBG(m, x)       __UL_DBG(whereis, WHEREIS_DEBUG_, m, x)
 #define ON_DBG(m, x)    __UL_DBG_CALL(whereis, WHEREIS_DEBUG_, m, x)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(whereis)
+#include "debugobj.h"
+
 static char uflag = 0;
 
 /* supported types */
index a9437aacbc744bf6e45ad73851400103fd6c8f41..4a39f66efa4ffc56f2cfec1f080923bfc8188e91 100644 (file)
@@ -66,6 +66,9 @@ UL_DEBUG_DEFINE_MASKNAMES(lsns) = UL_DEBUG_EMPTY_MASKNAMES;
 #define DBG(m, x)       __UL_DBG(lsns, LSNS_DEBUG_, m, x)
 #define ON_DBG(m, x)    __UL_DBG_CALL(lsns, LSNS_DEBUG_, m, x)
 
+#define UL_DEBUG_CURRENT_MASK  UL_DEBUG_MASK(lsns)
+#include "debugobj.h"
+
 static struct idcache *uid_cache = NULL;
 
 /* column IDs */