public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/pax-utils:master commit in: /
Date: Fri, 16 Apr 2021 19:03:36 +0000 (UTC)	[thread overview]
Message-ID: <1618599595.c68cfa4e47d59e9903509a1d90da178a982eb27e.vapier@gentoo> (raw)

commit:     c68cfa4e47d59e9903509a1d90da178a982eb27e
Author:     Mike Frysinger <vapier <AT> chromium <DOT> org>
AuthorDate: Fri Apr 16 18:59:55 2021 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Fri Apr 16 18:59:55 2021 +0000
URL:        https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=c68cfa4e

paxldso: add support for "new" glibc cache format

Glibc has supported a "new" cache format for a while now (almost 20
years), but since it generated both, we didn't bother to implement
it, only relying on the old cache format.  With glibc-2.32+ though,
it now only outputs the new format.

Rework the code so we support the old, new, and compat cache formats
(where the new format is appended to the old one).

Bug: https://bugs.gentoo.org/739014
Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>

 paxldso.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 179 insertions(+), 56 deletions(-)

diff --git a/paxldso.c b/paxldso.c
index d89210d..150f490 100644
--- a/paxldso.c
+++ b/paxldso.c
@@ -14,19 +14,28 @@
 
 #if PAX_LDSO_CACHE
 
-static void *ldcache = NULL;
+/* Memory region containing a specific cache. Will be a subset of the mmap. */
+static const void *ldcache = NULL;
 static size_t ldcache_size = 0;
 
+/* Entire memory mapped cache file. */
+static void *ldcache_mmap_base = NULL;
+static size_t ldcache_mmap_size = 0;
+
 static char *ldso_cache_buf = NULL;
 static size_t ldso_cache_buf_size = 0;
 
 #if defined(__GLIBC__) || defined(__UCLIBC__)
 
 /* Defines can be seen in glibc's sysdeps/generic/ldconfig.h */
-#define LDSO_CACHE_MAGIC             "ld.so-"
-#define LDSO_CACHE_MAGIC_LEN         (sizeof LDSO_CACHE_MAGIC -1)
-#define LDSO_CACHE_VER               "1.7.0"
-#define LDSO_CACHE_VER_LEN           (sizeof LDSO_CACHE_VER -1)
+#define LDSO_CACHE_MAGIC_OLD         "ld.so-"
+#define LDSO_CACHE_MAGIC_OLD_LEN     (sizeof LDSO_CACHE_MAGIC_OLD - 1)
+#define LDSO_CACHE_VER_OLD           "1.7.0"
+#define LDSO_CACHE_VER_OLD_LEN       (sizeof LDSO_CACHE_VER_OLD - 1)
+#define LDSO_CACHE_MAGIC_NEW         "glibc-ld.so.cache"
+#define LDSO_CACHE_MAGIC_NEW_LEN     (sizeof LDSO_CACHE_MAGIC_NEW - 1)
+#define LDSO_CACHE_VER_NEW           "1.1"
+#define LDSO_CACHE_VER_NEW_LEN       (sizeof LDSO_CACHE_VER_NEW - 1)
 #define FLAG_ANY                     -1
 #define FLAG_TYPE_MASK               0x00ff
 #define FLAG_LIBC4                   0x0000
@@ -48,14 +57,45 @@ static size_t ldso_cache_buf_size = 0;
 #define FLAG_MIPS_LIB32_NAN2008      0x0c00
 #define FLAG_MIPS64_LIBN32_NAN2008   0x0d00
 #define FLAG_MIPS64_LIBN64_NAN2008   0x0e00
+#define FLAG_RISCV_FLOAT_ABI_SOFT    0x0f00
+#define FLAG_RISCV_FLOAT_ABI_DOUBLE  0x1000
 
 typedef struct {
 	int flags;
 	unsigned int sooffset;
 	unsigned int liboffset;
-} libentry_t;
+} libentry_old_t;
+
+typedef struct {
+	const char magic[LDSO_CACHE_MAGIC_OLD_LEN];
+	const char version[LDSO_CACHE_VER_OLD_LEN];
+	unsigned int nlibs;
+	libentry_old_t libs[0];
+} header_old_t;
+
+typedef struct {
+	int32_t flags;
+	uint32_t sooffset;
+	uint32_t liboffset;
+	uint32_t osversion;
+	uint64_t hwcap;
+} libentry_new_t;
 
-static bool is_compatible(elfobj *elf, libentry_t *libent)
+typedef struct {
+	const char magic[LDSO_CACHE_MAGIC_NEW_LEN];
+	const char version[LDSO_CACHE_VER_NEW_LEN];
+	uint32_t nlibs;
+	uint32_t len_strings;
+	uint8_t flags;
+	uint8_t _pad_flags[3];
+	uint32_t extension_offset;
+	uint32_t _pad_ext[3];
+	libentry_new_t libs[0];
+} header_new_t;
+
+static bool ldcache_is_new;
+
+static bool is_compatible(elfobj *elf, const libentry_old_t *libent)
 {
 	int flags = libent->flags & FLAG_REQUIRED_MASK;
 
@@ -136,74 +176,124 @@ static bool is_compatible(elfobj *elf, libentry_t *libent)
 	return false;
 }
 
-char *ldso_cache_lookup_lib(elfobj *elf, const char *fname)
+static void ldso_cache_load(void)
 {
-	unsigned int nlib;
-	char *ret = NULL;
-	char *strs;
+	int fd;
+	const char *cachefile;
+	struct stat st;
+	const header_old_t *header_old;
+	const header_new_t *header_new;
 
-	typedef struct {
-		char magic[LDSO_CACHE_MAGIC_LEN];
-		char version[LDSO_CACHE_VER_LEN];
-		unsigned int nlibs;
-	} header_t;
-	header_t *header;
+	if (ldcache_mmap_base != NULL)
+		return;
 
-	libentry_t *libent;
+	cachefile = root_rel_path(ldcache_path);
 
-	if (fname == NULL)
-		return NULL;
+	if (fstatat(root_fd, cachefile, &st, 0))
+		return;
 
-	if (ldcache == NULL) {
-		int fd;
-		const char *cachefile = root_rel_path(ldcache_path);
-		struct stat st;
+	fd = openat(root_fd, cachefile, O_RDONLY);
+	if (fd == -1)
+		return;
 
-		if (fstatat(root_fd, cachefile, &st, 0))
-			return NULL;
+	/* cache these values so we only map/unmap the cache file once */
+	ldcache_mmap_size = st.st_size;
+	ldcache_mmap_base = mmap(0, ldcache_mmap_size, PROT_READ, MAP_SHARED, fd, 0);
+	close(fd);
 
-		fd = openat(root_fd, cachefile, O_RDONLY);
-		if (fd == -1)
-			return NULL;
-
-		/* cache these values so we only map/unmap the cache file once */
-		ldcache_size = st.st_size;
-		header = ldcache = mmap(0, ldcache_size, PROT_READ, MAP_SHARED, fd, 0);
-		close(fd);
+	if (ldcache_mmap_base == MAP_FAILED) {
+		ldcache_mmap_base = NULL;
+		return;
+	}
 
-		if (ldcache == MAP_FAILED) {
-			ldcache = NULL;
-			return NULL;
+	ldcache_size = ldcache_mmap_size;
+	ldcache = ldcache_mmap_base;
+	header_old = ldcache;
+	header_new = ldcache;
+#define memeq(mem1, mem2) (memcmp(mem1, mem2, sizeof(mem2) - 1) == 0)
+	if (memeq(header_new->magic, LDSO_CACHE_MAGIC_NEW) &&
+	    memeq(header_new->version, LDSO_CACHE_VER_NEW)) {
+		ldcache_is_new = true;
+	} else if (memeq(header_old->magic, LDSO_CACHE_MAGIC_OLD) &&
+	           memeq(header_old->version, LDSO_CACHE_VER_OLD)) {
+		/* See if the new cache format is appended after the old cache. */
+		uintptr_t end =
+			(uintptr_t)ldcache + sizeof(header_old_t) +
+			(header_old->nlibs * sizeof(libentry_old_t));
+		header_new = (const void *)ALIGN_UP(end, __alignof__(header_new_t));
+		if (memeq(header_new->magic, LDSO_CACHE_MAGIC_NEW) &&
+		    memeq(header_new->version, LDSO_CACHE_VER_NEW)) {
+			ldcache_is_new = true;
+			ldcache_size -= ((uintptr_t)header_new - (uintptr_t)ldcache);
+			ldcache = header_new;
+		} else {
+			ldcache_is_new = false;
 		}
+	} else {
+		munmap(ldcache_mmap_base, ldcache_mmap_size);
+		ldcache_mmap_base = NULL;
+		return;
+	}
+#undef memq
 
-		if (memcmp(header->magic, LDSO_CACHE_MAGIC, LDSO_CACHE_MAGIC_LEN) ||
-		    memcmp(header->version, LDSO_CACHE_VER, LDSO_CACHE_VER_LEN))
-		{
-			munmap(ldcache, ldcache_size);
-			ldcache = NULL;
-			return NULL;
-		}
+	ldso_cache_buf_size = 4096;
+	ldso_cache_buf = xrealloc(ldso_cache_buf, ldso_cache_buf_size);
+}
 
-		ldso_cache_buf_size = 4096;
-		ldso_cache_buf = xrealloc(ldso_cache_buf, ldso_cache_buf_size);
-	} else
-		header = ldcache;
+char *ldso_cache_lookup_lib(elfobj *elf, const char *fname)
+{
+	unsigned int nlib, nlibs;
+	char *ret = NULL;
+	const char *strs;
+	const libentry_old_t *libent_old;
+	const libentry_new_t *libent_new;
 
-	libent = ldcache + sizeof(header_t);
-	strs = (char *) &libent[header->nlibs];
+	if (fname == NULL)
+		return NULL;
 
-	for (nlib = 0; nlib < header->nlibs; ++nlib) {
+	ldso_cache_load();
+	if (ldcache == NULL)
+		return NULL;
+
+	if (ldcache_is_new) {
+		const header_new_t *header = ldcache;
+		libent_old = NULL;
+		libent_new = &header->libs[0];
+		strs = (const char *)header;
+		nlibs = header->nlibs;
+	} else {
+		const header_old_t *header = ldcache;
+		libent_old = &header->libs[0];
+		libent_new = NULL;
+		strs = (const char *)&libent_old[header->nlibs];
+		nlibs = header->nlibs;
+	}
+
+	/*
+	 * TODO: Should add memory range checking in case cache file is corrupt.
+	 * TODO: We search the cache from start to finish, but since we know the cache
+	 * is sorted, we really should be doing a binary search to speed it up.
+	 */
+	for (nlib = 0; nlib < nlibs; ++nlib) {
 		const char *lib;
 		size_t lib_len;
 
-		if (!is_compatible(elf, &libent[nlib]))
+		/* The first few fields are the same between new/old formats. */
+		const libentry_old_t *libent;
+		if (ldcache_is_new) {
+			libent = (void *)&libent_new[nlib];
+		} else {
+			libent = &libent_old[nlib];
+		}
+
+		if (!is_compatible(elf, libent))
 			continue;
 
-		if (strcmp(fname, strs + libent[nlib].sooffset) != 0)
+		if (strcmp(fname, strs + libent->sooffset) != 0)
 			continue;
 
 		/* Return first hit because that is how the ldso rolls */
-		lib = strs + libent[nlib].liboffset;
+		lib = strs + libent->liboffset;
 		lib_len = strlen(lib) + 1;
 		if (lib_len > ldso_cache_buf_size) {
 			ldso_cache_buf = xrealloc(ldso_cache_buf, ldso_cache_buf_size + 4096);
@@ -223,8 +313,8 @@ static void ldso_cache_cleanup(void)
 {
 	free(ldso_cache_buf);
 
-	if (ldcache != NULL)
-		munmap(ldcache, ldcache_size);
+	if (ldcache_mmap_base != NULL)
+		munmap(ldcache_mmap_base, ldcache_mmap_size);
 }
 
 #else
@@ -379,12 +469,45 @@ const char argv0[] = "paxldso";
 int main(int argc, char *argv[])
 {
 	elfobj *elf = readelf(argv[0]);
+	ldso_cache_load();
+	printf("cache file memory base is %p\n", ldcache_mmap_base);
+	printf("cache memory base is %p\n", ldcache);
 	for (int i = 1; i < argc; ++i) {
 		const char *search = argv[i];
 		const char *lib = ldso_cache_lookup_lib(elf, search);
 		printf("%s -> %s\n", search, lib);
 	}
 	unreadelf(elf);
+
+	if (ldcache) {
+		unsigned int nlib;
+		const char *strs, *s;
+
+		if (ldcache_is_new) {
+			const header_new_t *header = ldcache;
+			const libentry_new_t *libents = &header->libs[0];
+			strs = (const char *)header;
+			printf("dumping new cache format\n");
+
+			for (nlib = 0; nlib < header->nlibs; ++nlib) {
+				const libentry_new_t *libent = &libents[nlib];
+				s = strs + libent->sooffset;
+				printf("%p: %s\n", libent, s);
+			}
+		} else {
+			const header_old_t *header = ldcache;
+			const libentry_old_t *libents = &header->libs[0];
+			strs = (const char *)&libents[header->nlibs];
+			printf("dumping old cache format\n");
+
+			for (nlib = 0; nlib < header->nlibs; ++nlib) {
+				const libentry_old_t *libent = &libents[nlib];
+				s = strs + libent->sooffset;
+				printf("%p: %s\n", libent, s);
+			}
+		}
+	}
+
 	paxldso_cleanup();
 }
 


             reply	other threads:[~2021-04-16 19:03 UTC|newest]

Thread overview: 253+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-16 19:03 Mike Frysinger [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-09-22  4:33 [gentoo-commits] proj/pax-utils:master commit in: / Sam James
2024-09-22  4:30 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:02 Sam James
2024-07-22 21:07 Mike Gilbert
2024-07-22 20:08 Mike Gilbert
2024-01-25  6:52 Mike Frysinger
2024-01-25  5:57 Mike Frysinger
2024-01-25  5:57 Mike Frysinger
2024-01-25  5:36 Mike Frysinger
2024-01-25  5:21 Mike Frysinger
2024-01-25  5:06 Mike Frysinger
2024-01-25  5:06 Mike Frysinger
2024-01-25  4:44 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:14 Mike Frysinger
2024-01-24 22:53 Mike Frysinger
2024-01-24 22:15 Mike Frysinger
2024-01-24 15:44 Mike Frysinger
2024-01-16  5:13 Mike Frysinger
2024-01-16  5:13 Mike Frysinger
2024-01-10  8:05 Mike Frysinger
2024-01-10  8:02 Mike Frysinger
2024-01-10  8:02 Mike Frysinger
2024-01-10  7:58 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 16:28 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 19:57 Mike Frysinger
2023-11-23 13:31 Sam James
2023-02-13  5:26 Sam James
2023-02-13  5:26 Sam James
2023-01-29  5:56 Sam James
2023-01-29  5:56 Sam James
2023-01-29  5:56 Sam James
2023-01-29  3:41 Sam James
2023-01-29  3:36 Sam James
2023-01-29  3:36 Sam James
2023-01-26 21:46 Sam James
2023-01-06  7:15 Sam James
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-21  8:28 Mike Frysinger
2022-09-21  8:26 Mike Frysinger
2022-09-21  8:20 Mike Frysinger
2022-07-31  4:56 Sam James
2022-07-12  6:33 Sam James
2022-07-12  6:33 Sam James
2022-04-25  1:20 WANG Xuerui
2022-03-24 15:42 Sam James
2022-03-09  8:01 Mike Frysinger
2022-02-07  7:18 Fabian Groffen
2022-01-23  2:47 Mike Frysinger
2021-12-24  1:45 Sam James
2021-12-17  5:19 Mike Frysinger
2021-10-17  5:15 Mike Frysinger
2021-10-05  1:05 Mike Frysinger
2021-10-04 22:05 Mike Frysinger
2021-09-20  4:51 Sam James
2021-07-22 21:31 Sergei Trofimovich
2021-07-22 21:16 Sergei Trofimovich
2021-07-02 22:04 Sergei Trofimovich
2021-06-10  7:07 Sergei Trofimovich
2021-06-10  7:02 Sergei Trofimovich
2021-04-19  4:58 Mike Frysinger
2021-04-18 18:29 Mike Frysinger
2021-04-17  5:39 Mike Frysinger
2021-04-17  5:39 Mike Frysinger
2021-04-17  0:38 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:03 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16  3:41 Mike Frysinger
2021-04-16  3:39 Mike Frysinger
2021-04-16  3:39 Mike Frysinger
2021-04-16  1:56 Mike Frysinger
2021-04-16  1:56 Mike Frysinger
2021-04-16  0:48 Mike Frysinger
2021-04-16  0:48 Mike Frysinger
2021-02-26 11:51 Sergei Trofimovich
2021-02-04 18:51 Sergei Trofimovich
2021-02-03 20:41 Sergei Trofimovich
2021-02-03 20:17 Sergei Trofimovich
2021-02-03 19:46 Sergei Trofimovich
2021-01-01 14:08 Fabian Groffen
2021-01-01 14:08 Fabian Groffen
2020-12-20 19:53 Sergei Trofimovich
2020-10-05 17:46 Sergei Trofimovich
2020-08-14 22:17 Sergei Trofimovich
2020-04-13 10:41 Sergei Trofimovich
2020-04-06 18:00 Sergei Trofimovich
2020-03-26 19:27 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-19  0:00 Sergei Trofimovich
2020-03-18 23:39 Sergei Trofimovich
2020-02-16 10:57 Sergei Trofimovich
2020-02-16 10:50 Sergei Trofimovich
2020-02-16 10:48 Sergei Trofimovich
2020-02-16 10:17 Sergei Trofimovich
2019-01-14 22:53 Sergei Trofimovich
2018-11-19 22:20 Sergei Trofimovich
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-02-24 10:16 Sergei Trofimovich
2017-09-18  9:27 Fabian Groffen
2017-09-18  9:27 Fabian Groffen
2017-09-18  7:06 Fabian Groffen
2017-03-14  7:19 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-11  7:06 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2016-11-27  3:43 Mike Frysinger
2016-11-15  4:02 Mike Frysinger
2016-11-15  4:02 Mike Frysinger
2016-11-14 14:57 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-08 20:47 Mike Gilbert
2016-06-20 17:46 Mike Frysinger
2016-06-20  4:03 Mike Frysinger
2016-06-20  4:03 Mike Frysinger
2016-06-20  3:22 Mike Frysinger
2016-06-20  3:22 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-05-31 22:27 Mike Frysinger
2016-03-03 21:15 Mike Frysinger
2016-02-10 19:41 Mike Frysinger
2016-02-10 18:54 Mike Frysinger
2016-01-28 22:42 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:01 Mike Frysinger
2016-01-02 15:26 Mike Frysinger
2016-01-02  3:52 Mike Frysinger
2015-12-19 19:41 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-11-26  8:43 Mike Frysinger
2015-10-26  4:35 Mike Frysinger
2015-10-08 20:31 Mike Frysinger
2015-09-19  6:27 Mike Frysinger
2015-09-19  6:27 Mike Frysinger
2015-09-12  4:17 Mike Frysinger
2015-08-28  0:33 Mike Frysinger
2015-08-26  6:29 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 13:32 Mike Frysinger
2015-08-18 15:56 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 14:39 Mike Frysinger
2015-08-18 14:38 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-05-24  3:22 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-10  5:31 Mike Frysinger
2015-03-10  5:31 Mike Frysinger
2015-03-10  4:19 Mike Frysinger
2015-03-10  3:36 Mike Frysinger
2015-03-06 11:52 Mike Frysinger
2015-03-04 22:35 Mike Frysinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1618599595.c68cfa4e47d59e9903509a1d90da178a982eb27e.vapier@gentoo \
    --to=vapier@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox