diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | nscd/nscd_stat.c | 27 |
2 files changed, 32 insertions, 6 deletions
@@ -1,3 +1,14 @@ +2017-10-05 Florian Weimer <fweimer@redhat.com> + + nscd: Eliminate compilation time dependency in the build output. + * nscd/nscd_stat.c (STATDATA_VERSION) + (STATDATA_VERSION_SELINUX_FLAG, STATDATA_VERSION_FLAGS) + (STATDATA_VERSION_FULL): New macro definitions. + (compilation): Remove. + (struct statdata): Adjust version member. + (send_stats): Set version from STATDATA_VERSION_FULL. + (receive_print_stats): Verify version against STATDATA_VERSION_FULL. + 2017-10-05 Joseph Myers <joseph@codesourcery.com> * configure.ac (--enable-add-ons): Remove option. diff --git a/nscd/nscd_stat.c b/nscd/nscd_stat.c index feb1c98..b1bc81b 100644 --- a/nscd/nscd_stat.c +++ b/nscd/nscd_stat.c @@ -35,9 +35,23 @@ # include <selinux/avc.h> #endif /* HAVE_SELINUX */ +/* We use this to make sure the receiver is the same. The lower 16 + bits are reserved for flags indicating compilation variants. This + version needs to be updated if the definition of struct statdata + changes. */ +#define STATDATA_VERSION 0x01020000U -/* We use this to make sure the receiver is the same. */ -static const char compilation[21] = __DATE__ " " __TIME__; +#ifdef HAVE_SELINUX +# define STATDATA_VERSION_SELINUX_FLAG 0x0001U +#else +# define STATDATA_VERSION_SELINUX_FLAG 0x0000U +#endif + +/* All flags affecting the struct statdata layout. */ +#define STATDATA_VERSION_FLAGS STATDATA_VERSION_SELINUX_FLAG + +/* The full version number for struct statdata. */ +#define STATDATA_VERSION_FULL (STATDATA_VERSION | STATDATA_VERSION_FLAGS) /* Statistic data for one database. */ struct dbstat @@ -68,10 +82,11 @@ struct dbstat uintmax_t addfailed; }; -/* Record for transmitting statistics. */ +/* Record for transmitting statistics. If this definition changes, + update STATDATA_VERSION above. */ struct statdata { - char version[sizeof (compilation)]; + unsigned int version; /* Must be STATDATA_VERSION_FULL. */ int debug_level; time_t runtime; unsigned long int client_queued; @@ -96,7 +111,7 @@ send_stats (int fd, struct database_dyn dbs[lastdb]) memset (&data, 0, sizeof (data)); - memcpy (data.version, compilation, sizeof (compilation)); + data.version = STATDATA_VERSION_FULL; data.debug_level = debug_level; data.runtime = time (NULL) - start_time; data.client_queued = client_queued; @@ -196,7 +211,7 @@ receive_print_stats (void) /* Read as much data as we expect. */ if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data) - || (memcmp (data.version, compilation, sizeof (compilation)) != 0 + || (data.version != STATDATA_VERSION_FULL /* Yes, this is an assignment! */ && (errno = EINVAL))) { |