----- Original Message -----
----- Original Message -----
> Hi,
>
> I have a SuSE SLES11 vmcore with xen and tried to read the osrelease from
> the vmcore with
> # crash --osrelease vmcore
> unknown
>
> The problem is that there are two notes in the vmcore starting with
> "VMCOREINFO":
>
> Elf64_Nhdr:
> n_namesz: 11 ("VMCOREINFO")
> n_descsz: 1384
> n_type: 0 (unused)
> OSRELEASE=3.0.101-63-xen
> ...
> Elf64_Nhdr:
> n_namesz: 15 ("VMCOREINFO_XEN")
> n_descsz: 4068
> n_type: 0 (unused)
> ...
>
> In the function dump_Elf64_Nhdr() I found:
> vmcoreinfo = STRNEQ(buf, "VMCOREINFO");
>
> But because the "VMCOREINFO_XEN" ist the second one in the file it wins!
>
> When using
> vmcoreinfo = STREQ(buf, "VMCOREINFO");
> all is fine and I get:
> # crash --osrelease vmcore
> 3.0.101-63-xen
>
> So my question is: why is STRNEQ() used?
> Thanks!
Hello Dietmar,
As I recall, I did all of the note name checks that way because the length
of the name string is specified by the note->n_namesz field, and therefore
not necessarily guaranteed to be a NULL-terminated string? In reality,
they're probably will be a NULL there though.
Anyway, I wasn't even familiar with the existence of a VMCOREINFO_XEN note,
so please feel free to post a patch to address it.
Dave
This should work, right?:
--- crash-7.1.3/netdump.c.orig
+++ crash-7.1.3/netdump.c
@@ -1940,7 +1940,8 @@ dump_Elf32_Nhdr(Elf32_Off offset, int st
#endif
default:
xen_core = STRNEQ(buf, "XEN CORE") || STRNEQ(buf, "Xen");
- vmcoreinfo = STRNEQ(buf, "VMCOREINFO");
+ if (!STRNEQ(buf, "VMCOREINFO_XEN"))
+ vmcoreinfo = STRNEQ(buf, "VMCOREINFO");
eraseinfo = STRNEQ(buf, "ERASEINFO");
qemuinfo = STRNEQ(buf, "QEMU");
if (xen_core) {
@@ -2196,7 +2197,8 @@ dump_Elf64_Nhdr(Elf64_Off offset, int st
#endif
default:
xen_core = STRNEQ(buf, "XEN CORE") || STRNEQ(buf, "Xen");
- vmcoreinfo = STRNEQ(buf, "VMCOREINFO");
+ if (!STRNEQ(buf, "VMCOREINFO_XEN"))
+ vmcoreinfo = STRNEQ(buf, "VMCOREINFO");
eraseinfo = STRNEQ(buf, "ERASEINFO");
qemuinfo = STRNEQ(buf, "QEMU");
if (xen_core) {
Dave