----- Original Message ----- > > > ----- 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 Actually, the patch above will prevent the VMCOREINFO_XEN strings from being dumped in readable strings by "help -[nD]" or by "crash -d#". Try the attached patch instead, where both VMCOREINFO and VMCOREINFO_XEN string data will be dumped appropriately. I do have a couple old RHEL5 xen dom0 dumpfiles that have VMCOREINFO_XEN notes, but they do not have VMCOREINFO notes. It must be relatively newer Xen kernels that have both? Anyway, check out the updated patch and let me know. And BTW, checking the ELF specs, the name string should be NULL-terminated, and the n_namesz count should include the NULL-byte: namesz and name The first namesz bytes in name contain a null-terminated character representation of the entry's owner and originator. There's an accompanying diagram example that shows the namesz value counting the NULL terminator. However, the reason for STRNEQ() in crash stems from the fact that the original "netdump" generated ELF vmcores were incorrectly created such the n_namesz count did not include the NULL, and I believe that the descriptor data started immediately after the name string. For example, here's an old 2.6.9-based netdump generated vmcore, where the name is "CORE", and therefore *should* have a n_namesz of 5 if it included a NULL terminator: Elf64_Nhdr: n_namesz: 4 ("CORE") n_descsz: 336 n_type: 1 (NT_PRSTATUS) The correct way would include the NULL-byte as well, as is done with kdump generated ELF vmcores: Elf64_Nhdr: n_namesz: 5 ("CORE") n_descsz: 336 n_type: 1 (NT_PRSTATUS) So for backwards-compatibility, I'd prefer to leave the checks using STRNEQ(). Thanks, Dave
--- crash-7.1.3/netdump.c.orig +++ crash-7.1.3/netdump.c @@ -1845,7 +1845,7 @@ dump_Elf32_Nhdr(Elf32_Off offset, int st char buf[BUFSIZE]; char *ptr; ulong *uptr; - int xen_core, vmcoreinfo, eraseinfo, qemuinfo; + int xen_core, vmcoreinfo, vmcoreinfo_xen, eraseinfo, qemuinfo; uint64_t remaining, notesize; note = (Elf32_Nhdr *)((char *)nd->elf32 + offset); @@ -1940,7 +1940,10 @@ 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_xen = 1; + else + vmcoreinfo = STRNEQ(buf, "VMCOREINFO"); eraseinfo = STRNEQ(buf, "ERASEINFO"); qemuinfo = STRNEQ(buf, "QEMU"); if (xen_core) { @@ -2014,7 +2017,7 @@ dump_Elf32_Nhdr(Elf32_Off offset, int st } } - if (vmcoreinfo || eraseinfo) { + if (vmcoreinfo || eraseinfo || vmcoreinfo_xen) { netdump_print(" "); ptr += note->n_namesz + 1; for (i = 0; i < note->n_descsz; i++, ptr++) { @@ -2064,14 +2067,14 @@ dump_Elf64_Nhdr(Elf64_Off offset, int st char *ptr; ulonglong *uptr; int *iptr; - int xen_core, vmcoreinfo, eraseinfo, qemuinfo; + int xen_core, vmcoreinfo, vmcoreinfo_xen, eraseinfo, qemuinfo; uint64_t remaining, notesize; note = (Elf64_Nhdr *)((char *)nd->elf64 + offset); BZERO(buf, BUFSIZE); ptr = (char *)note + sizeof(Elf64_Nhdr); - xen_core = vmcoreinfo = eraseinfo = qemuinfo = FALSE; + xen_core = vmcoreinfo = vmcoreinfo_xen = eraseinfo = qemuinfo = FALSE; if (ptr > (nd->elf_header + nd->header_size)) { error(WARNING, @@ -2196,7 +2199,10 @@ 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_xen = 1; + else + vmcoreinfo = STRNEQ(buf, "VMCOREINFO"); eraseinfo = STRNEQ(buf, "ERASEINFO"); qemuinfo = STRNEQ(buf, "QEMU"); if (xen_core) { @@ -2302,7 +2308,7 @@ dump_Elf64_Nhdr(Elf64_Off offset, int st lf = 0; netdump_print("%08lx ", *iptr++); } - } else if (vmcoreinfo || eraseinfo) { + } else if (vmcoreinfo || eraseinfo || vmcoreinfo_xen) { netdump_print(" "); ptr += note->n_namesz + 1; for (i = 0; i < note->n_descsz; i++, ptr++) {
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility