On Wed, Apr 16, 2008 at 09:22:38AM +1000, Andrew Hood wrote: > I think I have also tracked down one of the reasons wireshark crashes.
[...] > At line 595 oids.c calls smiRenderOID to format the node. The implicit > node is not completely filled in, and wireshark/tshark crashes in > libsmi. This is not totally unreasonable since implicit nodes should > never be seen. A crash _inside_ libsmi is not really acceptable; smiRenderOID should return NULL if it can't do what the caller wants. So I created a sample MIB and a little program to test this (see attachment) and I found where things go wrong. Attached is a patch which causes smiRenderOID() to render the OID as a sequence of numbers in case it is called with SMI_RENDER_NAME or SMI_RENDER_QUALIFIED and the label of the node is not known. But this might not be the right thing to do; it might be better to fail by returning NULL so that the caller gets control of what should happen. On the other hand, we always append numeric OIDs. /js -- Juergen Schoenwaelder Jacobs University Bremen gGmbH Phone: +49 421 200 3587 Campus Ring 1, 28759 Bremen, Germany Fax: +49 421 200 3103 <http://www.jacobs-university.de/>
FOO-MIB DEFINITIONS ::= BEGIN IMPORTS mib-2 FROM SNMPv2-SMI; foo OBJECT IDENTIFIER ::= { mib-2 88 1 } END
#include <stdio.h> #include <smi.h> static SmiSubid oid[] = {1, 3, 6, 1, 2, 1, 88}; static void render(int flags) { char *s; s = smiRenderOID(sizeof(oid)/sizeof(SmiSubid), oid, flags); printf(">%s<\n", s); smiFree(s); } int main(int argc, char **argv) { int i; smiInit(NULL); for (i = 1; i < argc; i++) { smiLoadModule(argv[i]); } render(0); render(SMI_RENDER_NAME); render(SMI_RENDER_QUALIFIED); return 0; }
Index: smi.c =================================================================== --- smi.c (revision 8023) +++ smi.c (working copy) @@ -1878,7 +1878,7 @@ if (flags & (SMI_RENDER_NAME | SMI_RENDER_QUALIFIED)) { nodePtr = smiGetNodeByOID(oidlen, oid); - if (nodePtr) { + if (nodePtr && nodePtr->name) { i = nodePtr->oidlen; if (flags & SMI_RENDER_QUALIFIED) { modulePtr = smiGetNodeModule(nodePtr);
_______________________________________________ Wireshark-dev mailing list Wireshark-dev@wireshark.org http://www.wireshark.org/mailman/listinfo/wireshark-dev