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: Sun, 22 Jan 2017 17:59:32 +0000 (UTC)	[thread overview]
Message-ID: <1480052439.ba31869401a628a7f0167ea51ade7254c58714d8.vapier@gentoo> (raw)

commit:     ba31869401a628a7f0167ea51ade7254c58714d8
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 25 05:40:39 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Fri Nov 25 05:40:39 2016 +0000
URL:        https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=ba318694

scanelf: add helper funcs for looking up program headers

 scanelf.c | 404 ++++++++++++++++++++++++++++++++++----------------------------
 1 file changed, 222 insertions(+), 182 deletions(-)

diff --git a/scanelf.c b/scanelf.c
index 5632527..2a7c0ce 100644
--- a/scanelf.c
+++ b/scanelf.c
@@ -140,6 +140,55 @@ static const char *which(const char *fname, const char *envvar)
 	return NULL;
 }
 
+/*
+ * Return the index into the program header table for the |p_type| segment.
+ * Useful only when there is one instance of a particular type.
+ */
+static ssize_t scanelf_file_find_phdr(elfobj *elf, uint32_t p_type)
+{
+	ssize_t ret = -1;
+
+#define FIND_PT_TYPE(B) \
+	size_t i; \
+	Elf##B##_Ehdr *ehdr = EHDR ## B (elf->ehdr); \
+	Elf##B##_Phdr *phdr = PHDR ## B (elf->phdr); \
+	\
+	for (i = 0; i < EGET(ehdr->e_phnum); i++) { \
+		if (EGET(phdr[i].p_type) != p_type) \
+			continue; \
+		\
+		if (ret == -1) \
+			ret = i; \
+		else \
+			warnf("ELF has more than one %s segment !?", get_elfptype(p_type)); \
+	}
+	if (elf->phdr)
+		SCANELF_ELF_SIZED(FIND_PT_TYPE);
+
+	return ret;
+}
+
+static void *scanelf_file_get_pt_dynamic(elfobj *elf)
+{
+	ssize_t i = scanelf_file_find_phdr(elf, PT_DYNAMIC);
+	if (i == -1)
+		return NULL;
+
+#define CHECK_PT_DYNAMIC(B) \
+	Elf##B##_Phdr *phdr = &PHDR##B(elf->phdr)[i]; \
+	Elf##B##_Off offset; \
+	\
+	if (EGET(phdr->p_filesz) == 0) \
+		break; \
+	offset = EGET(phdr->p_offset); \
+	if (offset >= elf->len - sizeof(Elf##B##_Dyn)) \
+		break; \
+	return phdr;
+	SCANELF_ELF_SIZED(CHECK_PT_DYNAMIC);
+
+	return NULL;
+}
+
 /* sub-funcs for scanelf_fileat() */
 static void scanelf_file_get_symtabs(elfobj *elf, void **sym, void **str)
 {
@@ -209,7 +258,7 @@ static void scanelf_file_get_symtabs(elfobj *elf, void **sym, void **str)
 	size_t i; \
 	static Elf ## B ## _Shdr sym_shdr, str_shdr; \
 	Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \
-	Elf ## B ## _Phdr *phdr = PHDR ## B (elf->phdr); \
+	Elf ## B ## _Phdr *phdr; \
 	Elf ## B ## _Addr vsym, vstr, vhash, vgnu_hash; \
 	Elf ## B ## _Dyn *dyn; \
 	Elf ## B ## _Off offset; \
@@ -218,28 +267,24 @@ static void scanelf_file_get_symtabs(elfobj *elf, void **sym, void **str)
 	vsym = vstr = vhash = vgnu_hash = 0; \
 	memset(&sym_shdr, 0, sizeof(sym_shdr)); \
 	memset(&str_shdr, 0, sizeof(str_shdr)); \
-	for (i = 0; i < EGET(ehdr->e_phnum); i++) { \
-		if (EGET(phdr[i].p_type) != PT_DYNAMIC) \
-			continue; \
-		\
-		offset = EGET(phdr[i].p_offset); \
-		if (offset >= elf->len - sizeof(Elf ## B ## _Dyn)) \
-			continue; \
-		\
-		dyn = DYN ## B (elf->vdata + offset); \
-		while (EGET(dyn->d_tag) != DT_NULL) { \
-			switch (EGET(dyn->d_tag)) { \
-			case DT_SYMTAB:   vsym = EGET(dyn->d_un.d_val); break; \
-			case DT_SYMENT:   sym_shdr.sh_entsize = dyn->d_un.d_val; break; \
-			case DT_STRTAB:   vstr = EGET(dyn->d_un.d_val); break; \
-			case DT_STRSZ:    str_shdr.sh_size = dyn->d_un.d_val; break; \
-			case DT_HASH:     vhash = EGET(dyn->d_un.d_val); break; \
-			/*case DT_GNU_HASH: vgnu_hash = EGET(dyn->d_un.d_val); break;*/ \
-			} \
-			++dyn; \
+	\
+	/* Find the dynamic headers */ \
+	phdr = scanelf_file_get_pt_dynamic(elf); \
+	if (phdr == NULL) \
+		break; \
+	offset = EGET(phdr->p_offset); \
+	\
+	dyn = DYN ## B (elf->vdata + offset); \
+	while (EGET(dyn->d_tag) != DT_NULL) { \
+		switch (EGET(dyn->d_tag)) { \
+		case DT_SYMTAB:   vsym = EGET(dyn->d_un.d_val); break; \
+		case DT_SYMENT:   sym_shdr.sh_entsize = dyn->d_un.d_val; break; \
+		case DT_STRTAB:   vstr = EGET(dyn->d_un.d_val); break; \
+		case DT_STRSZ:    str_shdr.sh_size = dyn->d_un.d_val; break; \
+		case DT_HASH:     vhash = EGET(dyn->d_un.d_val); break; \
+		/*case DT_GNU_HASH: vgnu_hash = EGET(dyn->d_un.d_val); break;*/ \
 		} \
-		if (vsym && vstr) \
-			break; \
+		++dyn; \
 	} \
 	if (!vsym || !vstr || !(vhash || vgnu_hash)) \
 		return; \
@@ -486,7 +531,6 @@ static char *scanelf_file_phdr(elfobj *elf, char *found_phdr, char *found_relro,
 static const char *scanelf_file_textrel(elfobj *elf, char *found_textrel)
 {
 	static const char *ret = "TEXTREL";
-	unsigned long i;
 
 	if (!show_textrel && !show_textrels) return NULL;
 
@@ -494,22 +538,23 @@ static const char *scanelf_file_textrel(elfobj *elf, char *found_textrel)
 
 #define SHOW_TEXTREL(B) \
 	Elf ## B ## _Dyn *dyn; \
-	Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \
-	Elf ## B ## _Phdr *phdr = PHDR ## B (elf->phdr); \
+	Elf ## B ## _Phdr *phdr; \
 	Elf ## B ## _Off offset; \
-	for (i = 0; i < EGET(ehdr->e_phnum); i++) { \
-		if (EGET(phdr[i].p_type) != PT_DYNAMIC || EGET(phdr[i].p_filesz) == 0) continue; \
-		offset = EGET(phdr[i].p_offset); \
-		if (offset >= elf->len - sizeof(Elf ## B ## _Dyn)) continue; \
-		dyn = DYN ## B (elf->vdata + offset); \
-		while (EGET(dyn->d_tag) != DT_NULL) { \
-			if (EGET(dyn->d_tag) == DT_TEXTREL) { /*dyn->d_tag != DT_FLAGS)*/ \
-				*found_textrel = 1; \
-				/*if (dyn->d_un.d_val & DF_TEXTREL)*/ \
-				return (be_wewy_wewy_quiet ? NULL : ret); \
-			} \
-			++dyn; \
+	\
+	/* Find the dynamic headers */ \
+	phdr = scanelf_file_get_pt_dynamic(elf); \
+	if (phdr == NULL) \
+		break; \
+	offset = EGET(phdr->p_offset); \
+	\
+	dyn = DYN ## B (elf->vdata + offset); \
+	while (EGET(dyn->d_tag) != DT_NULL) { \
+		if (EGET(dyn->d_tag) == DT_TEXTREL) { /*dyn->d_tag != DT_FLAGS)*/ \
+			*found_textrel = 1; \
+			/*if (dyn->d_un.d_val & DF_TEXTREL)*/ \
+			return (be_wewy_wewy_quiet ? NULL : ret); \
 		} \
+		++dyn; \
 	}
 	if (elf->phdr)
 		SCANELF_ELF_SIZED(SHOW_TEXTREL);
@@ -680,7 +725,6 @@ static void rpath_security_checks(elfobj *elf, char *item, const char *dt_type)
 }
 static void scanelf_file_rpath(elfobj *elf, char *found_rpath, char **ret, size_t *ret_len)
 {
-	unsigned long i;
 	char *rpath, *runpath, **r;
 	void *strtbl_void;
 
@@ -691,112 +735,111 @@ static void scanelf_file_rpath(elfobj *elf, char *found_rpath, char **ret, size_
 
 #define SHOW_RPATH(B) \
 	Elf ## B ## _Dyn *dyn; \
-	Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \
-	Elf ## B ## _Phdr *phdr = PHDR ## B (elf->phdr); \
+	Elf ## B ## _Phdr *phdr; \
 	Elf ## B ## _Shdr *strtbl = SHDR ## B (strtbl_void); \
 	Elf ## B ## _Off offset; \
 	Elf ## B ## _Xword word; \
-	/* Scan all the program headers */ \
-	for (i = 0; i < EGET(ehdr->e_phnum); i++) { \
-		/* Just scan dynamic headers */ \
-		if (EGET(phdr[i].p_type) != PT_DYNAMIC || EGET(phdr[i].p_filesz) == 0) continue; \
-		offset = EGET(phdr[i].p_offset); \
-		if (offset >= elf->len - sizeof(Elf ## B ## _Dyn)) continue; \
-		/* Just scan dynamic RPATH/RUNPATH headers */ \
-		dyn = DYN ## B (elf->vdata + offset); \
-		while ((word=EGET(dyn->d_tag)) != DT_NULL) { \
-			if (word == DT_RPATH) { \
-				r = &rpath; \
-			} else if (word == DT_RUNPATH) { \
-				r = &runpath; \
-			} else { \
-				++dyn; \
-				continue; \
+	\
+	/* Find the dynamic headers */ \
+	phdr = scanelf_file_get_pt_dynamic(elf); \
+	if (phdr == NULL) \
+		break; \
+	offset = EGET(phdr->p_offset); \
+	\
+	/* Just scan dynamic RPATH/RUNPATH headers */ \
+	dyn = DYN ## B (elf->vdata + offset); \
+	while ((word=EGET(dyn->d_tag)) != DT_NULL) { \
+		if (word == DT_RPATH) { \
+			r = &rpath; \
+		} else if (word == DT_RUNPATH) { \
+			r = &runpath; \
+		} else { \
+			++dyn; \
+			continue; \
+		} \
+		/* Verify the memory is somewhat sane */ \
+		offset = EGET(strtbl->sh_offset) + EGET(dyn->d_un.d_ptr); \
+		if (offset < (Elf ## B ## _Off)elf->len) { \
+			if (*r) warn("ELF has multiple %s's !?", get_elfdtype(word)); \
+			*r = elf->data + offset; \
+			/* cache the length in case we need to nuke this section later on */ \
+			if (fix_elf) \
+				offset = strlen(*r); \
+			/* If quiet, don't output paths in ld.so.conf */ \
+			if (be_quiet) { \
+				size_t len; \
+				char *start, *end; \
+				/* note that we only 'chop' off leading known paths. */ \
+				/* since *r is read-only memory, we can only move the ptr forward. */ \
+				start = *r; \
+				/* scan each path in : delimited list */ \
+				while (start) { \
+					rpath_security_checks(elf, start, get_elfdtype(word)); \
+					end = strchr(start, ':'); \
+					len = (end ? abs(end - start) : strlen(start)); \
+					if (use_ldcache) { \
+						size_t n; \
+						const char *ldpath; \
+						array_for_each(ldpaths, n, ldpath) \
+							if (!strncmp(ldpath, start, len) && !ldpath[len]) { \
+								*r = end; \
+								/* corner case ... if RPATH reads "/usr/lib:", we want \
+								 * to show ':' rather than '' */ \
+								if (end && end[1] != '\0') \
+									(*r)++; \
+								break; \
+							} \
+					} \
+					if (!*r || !end) \
+						break; \
+					else \
+						start = start + len + 1; \
+				} \
 			} \
-			/* Verify the memory is somewhat sane */ \
-			offset = EGET(strtbl->sh_offset) + EGET(dyn->d_un.d_ptr); \
-			if (offset < (Elf ## B ## _Off)elf->len) { \
-				if (*r) warn("ELF has multiple %s's !?", get_elfdtype(word)); \
-				*r = elf->data + offset; \
-				/* cache the length in case we need to nuke this section later on */ \
-				if (fix_elf) \
-					offset = strlen(*r); \
-				/* If quiet, don't output paths in ld.so.conf */ \
-				if (be_quiet) { \
-					size_t len; \
+			if (*r) { \
+				if (fix_elf > 2 || (fix_elf && **r == '\0')) { \
+					/* just nuke it */ \
+					nuke_it##B: \
+					memset(*r, 0x00, offset); \
+					*r = NULL; \
+					ESET(dyn->d_tag, DT_DEBUG); \
+					ESET(dyn->d_un.d_ptr, 0); \
+				} else if (fix_elf) { \
+					/* try to clean "bad" paths */ \
+					size_t len, tmpdir_len; \
 					char *start, *end; \
-					/* note that we only 'chop' off leading known paths. */ \
-					/* since *r is read-only memory, we can only move the ptr forward. */ \
+					const char *tmpdir; \
 					start = *r; \
-					/* scan each path in : delimited list */ \
-					while (start) { \
-						rpath_security_checks(elf, start, get_elfdtype(word)); \
+					tmpdir = (getenv("TMPDIR") ? : "."); \
+					tmpdir_len = strlen(tmpdir); \
+					while (1) { \
 						end = strchr(start, ':'); \
-						len = (end ? abs(end - start) : strlen(start)); \
-						if (use_ldcache) { \
-							size_t n; \
-							const char *ldpath; \
-							array_for_each(ldpaths, n, ldpath) \
-								if (!strncmp(ldpath, start, len) && !ldpath[len]) { \
-									*r = end; \
-									/* corner case ... if RPATH reads "/usr/lib:", we want \
-									 * to show ':' rather than '' */ \
-									if (end && end[1] != '\0') \
-										(*r)++; \
-									break; \
-								} \
+						if (start == end) { \
+							eat_this_path##B: \
+							len = strlen(end); \
+							memmove(start, end+1, len); \
+							start[len-1] = '\0'; \
+							end = start - 1; \
+						} else if (tmpdir && !strncmp(start, tmpdir, tmpdir_len)) { \
+							if (!end) { \
+								if (start == *r) \
+									goto nuke_it##B; \
+								*--start = '\0'; \
+							} else \
+								goto eat_this_path##B; \
 						} \
-						if (!*r || !end) \
+						if (!end) \
 							break; \
-						else \
-							start = start + len + 1; \
+						start = end + 1; \
 					} \
+					if (**r == '\0') \
+						goto nuke_it##B; \
 				} \
-				if (*r) { \
-					if (fix_elf > 2 || (fix_elf && **r == '\0')) { \
-						/* just nuke it */ \
-						nuke_it##B: \
-						memset(*r, 0x00, offset); \
-						*r = NULL; \
-						ESET(dyn->d_tag, DT_DEBUG); \
-						ESET(dyn->d_un.d_ptr, 0); \
-					} else if (fix_elf) { \
-						/* try to clean "bad" paths */ \
-						size_t len, tmpdir_len; \
-						char *start, *end; \
-						const char *tmpdir; \
-						start = *r; \
-						tmpdir = (getenv("TMPDIR") ? : "."); \
-						tmpdir_len = strlen(tmpdir); \
-						while (1) { \
-							end = strchr(start, ':'); \
-							if (start == end) { \
-								eat_this_path##B: \
-								len = strlen(end); \
-								memmove(start, end+1, len); \
-								start[len-1] = '\0'; \
-								end = start - 1; \
-							} else if (tmpdir && !strncmp(start, tmpdir, tmpdir_len)) { \
-								if (!end) { \
-									if (start == *r) \
-										goto nuke_it##B; \
-									*--start = '\0'; \
-								} else \
-									goto eat_this_path##B; \
-							} \
-							if (!end) \
-								break; \
-							start = end + 1; \
-						} \
-						if (**r == '\0') \
-							goto nuke_it##B; \
-					} \
-					if (*r) \
-						*found_rpath = 1; \
-				} \
+				if (*r) \
+					*found_rpath = 1; \
 			} \
-			++dyn; \
 		} \
+		++dyn; \
 	}
 	if (elf->phdr && strtbl_void)
 		SCANELF_ELF_SIZED(SHOW_RPATH);
@@ -837,7 +880,6 @@ static char *lookup_config_lib(const char *fname)
 
 static const char *scanelf_file_needed_lib(elfobj *elf, char *found_needed, char *found_lib, int op, char **ret, size_t *ret_len)
 {
-	unsigned long i;
 	char *needed;
 	void *strtbl_void;
 	char *p;
@@ -853,63 +895,61 @@ static const char *scanelf_file_needed_lib(elfobj *elf, char *found_needed, char
 
 #define SHOW_NEEDED(B) \
 	Elf ## B ## _Dyn *dyn; \
-	Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \
-	Elf ## B ## _Phdr *phdr = PHDR ## B (elf->phdr); \
+	Elf ## B ## _Phdr *phdr; \
 	Elf ## B ## _Shdr *strtbl = SHDR ## B (strtbl_void); \
 	Elf ## B ## _Off offset; \
 	size_t matched = 0; \
-	/* Walk all the program headers to find the PT_DYNAMIC */ \
-	for (i = 0; i < EGET(ehdr->e_phnum); i++) { \
-		if (EGET(phdr[i].p_type) != PT_DYNAMIC || EGET(phdr[i].p_filesz) == 0) \
-			continue; \
-		offset = EGET(phdr[i].p_offset); \
-		if (offset >= elf->len - sizeof(Elf ## B ## _Dyn)) \
-			continue; \
-		/* Walk all the dynamic tags to find NEEDED entries */ \
-		dyn = DYN ## B (elf->vdata + offset); \
-		while (EGET(dyn->d_tag) != DT_NULL) { \
-			if (EGET(dyn->d_tag) == DT_NEEDED) { \
-				offset = EGET(strtbl->sh_offset) + EGET(dyn->d_un.d_ptr); \
-				if (offset >= (Elf ## B ## _Off)elf->len) { \
-					++dyn; \
-					continue; \
-				} \
-				needed = elf->data + offset; \
-				if (op == 0) { \
-					/* -n -> print all entries */ \
-					if (!be_wewy_wewy_quiet) { \
-						if (*found_needed) xchrcat(ret, ',', ret_len); \
-						if (use_ldpath) { \
-							if ((p = lookup_config_lib(needed)) != NULL) \
-								needed = p; \
-						} else if (use_ldcache) { \
-							if ((p = ldso_cache_lookup_lib(elf, needed)) != NULL) \
-								needed = p; \
-						} \
-						xstrcat(ret, needed, ret_len); \
-					} \
-					*found_needed = 1; \
-				} else { \
-					/* -N -> print matching entries */ \
-					size_t n; \
-					const char *find_lib_name; \
-					\
-					array_for_each(find_lib_arr, n, find_lib_name) { \
-						int invert = 1; \
-						if (find_lib_name[0] == '!') \
-							invert = 0, ++find_lib_name; \
-						if ((!strcmp(find_lib_name, needed)) == invert) \
-							++matched; \
-					} \
-					\
-					if (matched == array_cnt(find_lib_arr)) { \
-						*found_lib = 1; \
-						return (be_wewy_wewy_quiet ? NULL : find_lib); \
+	\
+	/* Find the dynamic headers */ \
+	phdr = scanelf_file_get_pt_dynamic(elf); \
+	if (phdr == NULL) \
+		break; \
+	offset = EGET(phdr->p_offset); \
+	\
+	/* Walk all the dynamic tags to find NEEDED entries */ \
+	dyn = DYN ## B (elf->vdata + offset); \
+	while (EGET(dyn->d_tag) != DT_NULL) { \
+		if (EGET(dyn->d_tag) == DT_NEEDED) { \
+			offset = EGET(strtbl->sh_offset) + EGET(dyn->d_un.d_ptr); \
+			if (offset >= (Elf ## B ## _Off)elf->len) { \
+				++dyn; \
+				continue; \
+			} \
+			needed = elf->data + offset; \
+			if (op == 0) { \
+				/* -n -> print all entries */ \
+				if (!be_wewy_wewy_quiet) { \
+					if (*found_needed) xchrcat(ret, ',', ret_len); \
+					if (use_ldpath) { \
+						if ((p = lookup_config_lib(needed)) != NULL) \
+							needed = p; \
+					} else if (use_ldcache) { \
+						if ((p = ldso_cache_lookup_lib(elf, needed)) != NULL) \
+							needed = p; \
 					} \
+					xstrcat(ret, needed, ret_len); \
+				} \
+				*found_needed = 1; \
+			} else { \
+				/* -N -> print matching entries */ \
+				size_t n; \
+				const char *find_lib_name; \
+				\
+				array_for_each(find_lib_arr, n, find_lib_name) { \
+					int invert = 1; \
+					if (find_lib_name[0] == '!') \
+						invert = 0, ++find_lib_name; \
+					if ((!strcmp(find_lib_name, needed)) == invert) \
+						++matched; \
+				} \
+				\
+				if (matched == array_cnt(find_lib_arr)) { \
+					*found_lib = 1; \
+					return (be_wewy_wewy_quiet ? NULL : find_lib); \
 				} \
 			} \
-			++dyn; \
 		} \
+		++dyn; \
 	}
 	if (elf->phdr && strtbl_void) {
 		SCANELF_ELF_SIZED(SHOW_NEEDED);


             reply	other threads:[~2017-01-22 17:59 UTC|newest]

Thread overview: 254+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-22 17:59 Mike Frysinger [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-07-13 12:32 [gentoo-commits] proj/pax-utils:master commit in: / Fabian Groffen
2024-09-22  4:33 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 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
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=1480052439.ba31869401a628a7f0167ea51ade7254c58714d8.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