Lines 4296-4305
snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data, size_t * length)
Link Here
|
4296 |
u_char type; |
4296 |
u_char type; |
4297 |
u_char msg_type; |
4297 |
u_char msg_type; |
4298 |
u_char *var_val; |
4298 |
u_char *var_val; |
4299 |
int badtype = 0; |
|
|
4300 |
size_t len; |
4299 |
size_t len; |
4301 |
size_t four; |
4300 |
size_t four; |
4302 |
netsnmp_variable_list *vp = NULL; |
4301 |
netsnmp_variable_list *vp = NULL, *vplast = NULL; |
4303 |
oid objid[MAX_OID_LEN]; |
4302 |
oid objid[MAX_OID_LEN]; |
4304 |
|
4303 |
|
4305 |
/* |
4304 |
/* |
Lines 4434-4471
snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data, size_t * length)
Link Here
|
4434 |
(ASN_SEQUENCE | ASN_CONSTRUCTOR), |
4433 |
(ASN_SEQUENCE | ASN_CONSTRUCTOR), |
4435 |
"varbinds"); |
4434 |
"varbinds"); |
4436 |
if (data == NULL) |
4435 |
if (data == NULL) |
4437 |
return -1; |
4436 |
goto fail; |
4438 |
|
4437 |
|
4439 |
/* |
4438 |
/* |
4440 |
* get each varBind sequence |
4439 |
* get each varBind sequence |
4441 |
*/ |
4440 |
*/ |
4442 |
while ((int) *length > 0) { |
4441 |
while ((int) *length > 0) { |
4443 |
netsnmp_variable_list *vptemp; |
4442 |
vp = SNMP_MALLOC_TYPEDEF(netsnmp_variable_list); |
4444 |
vptemp = (netsnmp_variable_list *) malloc(sizeof(*vptemp)); |
4443 |
if (NULL == vp) |
4445 |
if (0 == vptemp) { |
4444 |
goto fail; |
4446 |
return -1; |
|
|
4447 |
} |
4448 |
if (0 == vp) { |
4449 |
pdu->variables = vptemp; |
4450 |
} else { |
4451 |
vp->next_variable = vptemp; |
4452 |
} |
4453 |
vp = vptemp; |
4454 |
|
4445 |
|
4455 |
vp->next_variable = NULL; |
|
|
4456 |
vp->val.string = NULL; |
4457 |
vp->name_length = MAX_OID_LEN; |
4446 |
vp->name_length = MAX_OID_LEN; |
4458 |
vp->name = 0; |
|
|
4459 |
vp->index = 0; |
4460 |
vp->data = 0; |
4461 |
vp->dataFreeHook = 0; |
4462 |
DEBUGDUMPSECTION("recv", "VarBind"); |
4447 |
DEBUGDUMPSECTION("recv", "VarBind"); |
4463 |
data = snmp_parse_var_op(data, objid, &vp->name_length, &vp->type, |
4448 |
data = snmp_parse_var_op(data, objid, &vp->name_length, &vp->type, |
4464 |
&vp->val_len, &var_val, length); |
4449 |
&vp->val_len, &var_val, length); |
4465 |
if (data == NULL) |
4450 |
if (data == NULL) |
4466 |
return -1; |
4451 |
goto fail; |
4467 |
if (snmp_set_var_objid(vp, objid, vp->name_length)) |
4452 |
if (snmp_set_var_objid(vp, objid, vp->name_length)) |
4468 |
return -1; |
4453 |
goto fail; |
4469 |
|
4454 |
|
4470 |
len = MAX_PACKET_LENGTH; |
4455 |
len = MAX_PACKET_LENGTH; |
4471 |
DEBUGDUMPHEADER("recv", "Value"); |
4456 |
DEBUGDUMPHEADER("recv", "Value"); |
Lines 4530-4536
snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data, size_t * length)
Link Here
|
4530 |
vp->val.string = (u_char *) malloc(vp->val_len); |
4515 |
vp->val.string = (u_char *) malloc(vp->val_len); |
4531 |
} |
4516 |
} |
4532 |
if (vp->val.string == NULL) { |
4517 |
if (vp->val.string == NULL) { |
4533 |
return -1; |
4518 |
goto fail; |
4534 |
} |
4519 |
} |
4535 |
asn_parse_string(var_val, &len, &vp->type, vp->val.string, |
4520 |
asn_parse_string(var_val, &len, &vp->type, vp->val.string, |
4536 |
&vp->val_len); |
4521 |
&vp->val_len); |
Lines 4541-4547
snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data, size_t * length)
Link Here
|
4541 |
vp->val_len *= sizeof(oid); |
4526 |
vp->val_len *= sizeof(oid); |
4542 |
vp->val.objid = (oid *) malloc(vp->val_len); |
4527 |
vp->val.objid = (oid *) malloc(vp->val_len); |
4543 |
if (vp->val.objid == NULL) { |
4528 |
if (vp->val.objid == NULL) { |
4544 |
return -1; |
4529 |
goto fail; |
4545 |
} |
4530 |
} |
4546 |
memmove(vp->val.objid, objid, vp->val_len); |
4531 |
memmove(vp->val.objid, objid, vp->val_len); |
4547 |
break; |
4532 |
break; |
Lines 4553-4571
snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data, size_t * length)
Link Here
|
4553 |
case ASN_BIT_STR: |
4538 |
case ASN_BIT_STR: |
4554 |
vp->val.bitstring = (u_char *) malloc(vp->val_len); |
4539 |
vp->val.bitstring = (u_char *) malloc(vp->val_len); |
4555 |
if (vp->val.bitstring == NULL) { |
4540 |
if (vp->val.bitstring == NULL) { |
4556 |
return -1; |
4541 |
goto fail; |
4557 |
} |
4542 |
} |
4558 |
asn_parse_bitstring(var_val, &len, &vp->type, |
4543 |
asn_parse_bitstring(var_val, &len, &vp->type, |
4559 |
vp->val.bitstring, &vp->val_len); |
4544 |
vp->val.bitstring, &vp->val_len); |
4560 |
break; |
4545 |
break; |
4561 |
default: |
4546 |
default: |
4562 |
snmp_log(LOG_ERR, "bad type returned (%x)\n", vp->type); |
4547 |
snmp_log(LOG_ERR, "bad type returned (%x)\n", vp->type); |
4563 |
badtype = -1; |
4548 |
goto fail; |
4564 |
break; |
4549 |
break; |
4565 |
} |
4550 |
} |
4566 |
DEBUGINDENTADD(-4); |
4551 |
DEBUGINDENTADD(-4); |
|
|
4552 |
|
4553 |
if (NULL == vplast) { |
4554 |
pdu->variables = vp; |
4555 |
} else { |
4556 |
vplast->next_variable = vp; |
4557 |
} |
4558 |
vplast = vp; |
4559 |
vp = NULL; |
4567 |
} |
4560 |
} |
4568 |
return badtype; |
4561 |
return 0; |
|
|
4562 |
|
4563 |
fail: |
4564 |
DEBUGMSGTL(("recv", "error while parsing VarBindList\n")); |
4565 |
/** if we were parsing a var, remove it from the pdu and free it */ |
4566 |
if (vp) |
4567 |
snmp_free_var(vp); |
4568 |
|
4569 |
return -1; |
4569 |
} |
4570 |
} |
4570 |
|
4571 |
|
4571 |
/* |
4572 |
/* |