Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 546792
Collapse All | Expand All

(-)a/snmplib/snmp_api.c (-27 / +28 lines)
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
/*

Return to bug 546792