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();
}
next 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