diff --git a/defs.h b/defs.h index c899fe2..9a8030a 100644 --- a/defs.h +++ b/defs.h @@ -2104,6 +2104,7 @@ struct offset_table { /* stash of commonly-used offsets */ long inode_i_sb_list; long irq_common_data_affinity; long irq_desc_irq_common_data; + long uts_namespace_name; }; struct size_table { /* stash of commonly-used sizes */ diff --git a/kernel.c b/kernel.c index 5ae8cf1..9871637 100644 --- a/kernel.c +++ b/kernel.c @@ -230,16 +230,21 @@ kernel_init() fprintf(fp, "%s\n\n", ctime_tz(&kt->date.tv_sec)); clean_exit(0); } - + + MEMBER_OFFSET_INIT(uts_namespace_name, "uts_namespace", "name"); if (symbol_exists("system_utsname")) readmem(symbol_value("system_utsname"), KVADDR, &kt->utsname, sizeof(struct new_utsname), "system_utsname", RETURN_ON_ERROR); - else if (symbol_exists("init_uts_ns")) - readmem(symbol_value("init_uts_ns") + sizeof(int), - KVADDR, &kt->utsname, sizeof(struct new_utsname), + else if (symbol_exists("init_uts_ns")) { + long offset = sizeof(int); + if (VALID_MEMBER(uts_namespace_name)) + offset = OFFSET(uts_namespace_name); + + readmem(symbol_value("init_uts_ns") + offset, + KVADDR, &kt->utsname, sizeof(struct new_utsname), "init_uts_ns", RETURN_ON_ERROR); - else + } else error(INFO, "cannot access utsname information\n\n"); if (CRASHDEBUG(1)) { diff --git a/symbols.c b/symbols.c index d22fb1d..3dd5fa1 100644 --- a/symbols.c +++ b/symbols.c @@ -10585,6 +10585,9 @@ dump_offset_table(char *spec, ulong makestruct) fprintf(fp, " xa_node_shift: %ld\n", OFFSET(xa_node_shift)); + fprintf(fp, " uts_namespace_name: %ld\n", + OFFSET(uts_namespace_name)); + fprintf(fp, "\n size_table:\n"); fprintf(fp, " page: %ld\n", SIZE(page)); fprintf(fp, " page_flags: %ld\n", SIZE(page_flags));