[RFC PATCH 14/15] Fix symbol_search_next, symbol_complete_match and get_syment_array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Kazuhito Hagio <k-hagio-ab@xxxxxxx>
---
 symbols.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 78 insertions(+), 3 deletions(-)

diff --git a/symbols.c b/symbols.c
index db22f3c4e8b3..4c7fe06b3aad 100644
--- a/symbols.c
+++ b/symbols.c
@@ -5370,7 +5370,7 @@ old_module:
 struct syment *
 symbol_search_next(char *s, struct syment *spstart)
 {
-	int i;
+	int i, j;
         struct syment *sp, *sp_end;
 	struct load_module *lm;
 	int found_start;
@@ -5390,6 +5390,31 @@ symbol_search_next(char *s, struct syment *spstart)
 		}
         }
 
+	if (!MODULE_MEMORY())
+		goto old_module;
+
+        for (i = 0; i < st->mods_installed; i++) {
+                lm = &st->load_modules[i];
+		for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+			if (!lm->symtable[j])
+				continue;
+
+			sp = lm->symtable[j];
+			sp_end = lm->symend[j];
+			for (; sp < sp_end; sp++) {
+				if (sp == spstart) {
+					found_start = TRUE;
+					continue;
+				} else if (!found_start)
+					continue;
+
+				if (STREQ(s, sp->name))
+					return sp;
+			}
+		}
+	}
+
+old_module:
 	pseudos = (strstr(s, "_MODULE_START_") || strstr(s, "_MODULE_END_"));
 	search_init = FALSE;
 
@@ -6536,7 +6561,7 @@ kernel_symbol_search(char *symbol)
 int
 get_syment_array(char *symbol, struct syment **sp_array, int max)
 {
-        int i, cnt;
+        int i, j, cnt;
         struct syment *sp, *sp_end;
         struct load_module *lm;
 
@@ -6561,6 +6586,31 @@ get_syment_array(char *symbol, struct syment **sp_array, int max)
 		}
         }
 
+	if (!MODULE_MEMORY())
+		goto old_module;
+
+        for (i = 0; i < st->mods_installed; i++) {
+                lm = &st->load_modules[i];
+
+		for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+			if (!lm->symtable[j])
+				continue;
+
+			sp = lm->symtable[j];
+			sp_end = lm->symend[j];
+			for (; sp < sp_end; sp++) {
+				if (STREQ(symbol, sp->name)) {
+					if (max && (cnt < max))
+						sp_array[cnt] = sp;
+					cnt++;
+				}
+			}
+		}
+	}
+
+	return cnt;
+
+old_module:
         for (i = 0; i < st->mods_installed; i++) {
                 lm = &st->load_modules[i];
                 sp = lm->mod_symtable;
@@ -14712,7 +14762,7 @@ is_downsized(char *name)
 struct syment *
 symbol_complete_match(const char *match, struct syment *sp_last)
 {
-	int i;
+	int i, j;
 	struct syment *sp, *sp_end, *sp_start;
 	struct load_module *lm;
 	int search_init;
@@ -14732,6 +14782,31 @@ symbol_complete_match(const char *match, struct syment *sp_last)
 		sp_start = NULL;
 	}
 
+	if (!MODULE_MEMORY())
+		goto old_module;
+
+	for (i = 0; i < st->mods_installed; i++) {
+		lm = &st->load_modules[i];
+		for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+			sp_end = lm->symend[j];
+			if (!sp_start)
+				sp_start = lm->symtable[j];
+
+			if (sp_start < lm->symtable[j] || sp_start > sp_end)
+				continue;
+
+			for (sp = sp_start; sp < sp_end; sp++) {
+				if (MODULE_PSEUDO_SYMBOL(sp))
+					continue;
+
+				if (STRNEQ(sp->name, match))
+					return sp;
+			}
+			sp_start = NULL;
+		}
+	}
+
+old_module:
 	search_init = FALSE;
 
 	for (i = 0; i < st->mods_installed; i++) {
-- 
2.31.1

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux