
19 Mar
2002
19 Mar
'02
11:59 a.m.
Pamela> Hello, I am using libsmi0.3.1 on Windows NT compiling with VC Pamela> 6.0. When I load our sample mib module, I get an exception in Pamela> smiparse() function in the scope of the loadModule() routine.
[...]
Pamela> gets an exception because objectPtr->typePtr is NULL. I ran Pamela> smilint.exe against fooTest.mib and it gets an exception Pamela> also. I have included our sample mibs that I have been testing Pamela> with. fooTest.mib imports fooCorp.mib.
This problem also occurs on Unix - the parser had problems to recover gracefully from missing type definitions. Below is a patch which I just checked into the CVS which seems to fix this problem.
/js
--
Juergen Schoenwaelder http://www.informatik.uni-osnabrueck.de/schoenw/
Index: lib/parser-smi.y
===================================================================
RCS file: /home/strauss/.cvs-repository/libsmi/lib/parser-smi.y,v
retrieving revision 1.167
diff -U8 -r1.167 parser-smi.y
--- lib/parser-smi.y 11 Mar 2002 08:52:42 -0000 1.167
+++ lib/parser-smi.y 19 Mar 2002 10:53:45 -0000
@@ -2308,45 +2308,47 @@
STATUS Status
descriptionClause
ReferPart
IndexPart
DefValPart
COLON_COLON_EQUAL '{' ObjectName '}'
{
Object *objectPtr, *parentPtr;
- Type *typePtr;
+ Type *typePtr = NULL;
objectPtr = $17;
smiCheckObjectReuse(thisParserPtr, $1, &objectPtr);
objectPtr = setObjectName(objectPtr, $1);
setObjectDecl(objectPtr, SMI_DECL_OBJECTTYPE);
setObjectLine(objectPtr, firstStatementLine,
thisParserPtr);
if (checkObjectFlags(objectPtr, FLAG_SEQTYPE)) {
deleteObjectFlags(objectPtr, FLAG_SEQTYPE);
- if ($6->export.name) {
- typePtr = $6;
- } else {
- typePtr = $6->parentPtr;
- }
- if ((objectPtr->typePtr != typePtr) &&
- ((objectPtr->typePtr->export.basetype !=
- SMI_BASETYPE_INTEGER32) ||
- (typePtr->export.basetype !=
- SMI_BASETYPE_ENUM)) &&
- ((objectPtr->typePtr->export.basetype !=
- SMI_BASETYPE_OCTETSTRING) ||
- (typePtr->export.basetype !=
- SMI_BASETYPE_BITS))) {
- smiPrintError(thisParserPtr,
- ERR_SEQUENCE_TYPE_MISMATCH,
- objectPtr->export.name);
+ if ($6) {
+ if ($6->export.name) {
+ typePtr = $6;
+ } else {
+ typePtr = $6->parentPtr;
+ }
+ if ((objectPtr->typePtr != typePtr) &&
+ ((objectPtr->typePtr->export.basetype !=
+ SMI_BASETYPE_INTEGER32) ||
+ (typePtr->export.basetype !=
+ SMI_BASETYPE_ENUM)) &&
+ ((objectPtr->typePtr->export.basetype !=
+ SMI_BASETYPE_OCTETSTRING) ||
+ (typePtr->export.basetype !=
+ SMI_BASETYPE_BITS))) {
+ smiPrintError(thisParserPtr,
+ ERR_SEQUENCE_TYPE_MISMATCH,
+ objectPtr->export.name);
+ }
}
}
setObjectType(objectPtr, $6);
if (!($6->export.name)) {
/*
* An inlined type.
*/
#if 0 /* export implicitly defined types by the node's lowercase name */
@@ -2407,20 +2409,21 @@
}
if ($13.indexkind != SMI_INDEX_UNKNOWN) {
setObjectList(objectPtr, $13.listPtr);
setObjectImplied(objectPtr, $13.implied);
setObjectIndexkind(objectPtr, $13.indexkind);
setObjectRelated(objectPtr, $13.rowPtr);
}
if ($14) {
- if (((objectPtr->typePtr->export.basetype == SMI_BASETYPE_OCTETSTRING) &&
- ($14->basetype != SMI_BASETYPE_OCTETSTRING)) ||
- ((objectPtr->typePtr->export.basetype == SMI_BASETYPE_OBJECTIDENTIFIER) &&
- ($14->basetype != SMI_BASETYPE_OBJECTIDENTIFIER))) {
+ if (objectPtr->typePtr
+ && (((objectPtr->typePtr->export.basetype == SMI_BASETYPE_OCTETSTRING) &&
+ ($14->basetype != SMI_BASETYPE_OCTETSTRING))
+ || ((objectPtr->typePtr->export.basetype == SMI_BASETYPE_OBJECTIDENTIFIER) &&
+ ($14->basetype != SMI_BASETYPE_OBJECTIDENTIFIER)))) {
smiPrintError(thisParserPtr,
ERR_DEFVAL_SYNTAX);
if ($14->basetype == SMI_BASETYPE_OBJECTIDENTIFIER) {
smiFree($14->value.oid);
}
if (($14->basetype == SMI_BASETYPE_BITS) ||
($14->basetype == SMI_BASETYPE_OCTETSTRING)) {
smiFree($14->value.ptr);