Line 0
Link Here
|
|
|
1 |
--- snmplib/snmp_api.c.orig 2015-08-05 13:06:13.000000000 +0500 |
2 |
+++ snmplib/snmp_api.c 2015-08-05 13:14:05.000000000 +0500 |
3 |
@@ -4350,10 +4350,9 @@ |
4 |
u_char type; |
5 |
u_char msg_type; |
6 |
u_char *var_val; |
7 |
- int badtype = 0; |
8 |
size_t len; |
9 |
size_t four; |
10 |
- netsnmp_variable_list *vp = NULL; |
11 |
+ netsnmp_variable_list *vp = NULL, *vplast = NULL; |
12 |
oid objid[MAX_OID_LEN]; |
13 |
u_char *p; |
14 |
|
15 |
@@ -4493,38 +4492,24 @@ |
16 |
(ASN_SEQUENCE | ASN_CONSTRUCTOR), |
17 |
"varbinds"); |
18 |
if (data == NULL) |
19 |
- return -1; |
20 |
+ goto fail; |
21 |
|
22 |
/* |
23 |
* get each varBind sequence |
24 |
*/ |
25 |
while ((int) *length > 0) { |
26 |
- netsnmp_variable_list *vptemp; |
27 |
- vptemp = (netsnmp_variable_list *) malloc(sizeof(*vptemp)); |
28 |
- if (NULL == vptemp) { |
29 |
- return -1; |
30 |
- } |
31 |
- if (NULL == vp) { |
32 |
- pdu->variables = vptemp; |
33 |
- } else { |
34 |
- vp->next_variable = vptemp; |
35 |
- } |
36 |
- vp = vptemp; |
37 |
+ vp = SNMP_MALLOC_TYPEDEF(netsnmp_variable_list); |
38 |
+ if (NULL == vp) |
39 |
+ goto fail; |
40 |
|
41 |
- vp->next_variable = NULL; |
42 |
- vp->val.string = NULL; |
43 |
vp->name_length = MAX_OID_LEN; |
44 |
- vp->name = NULL; |
45 |
- vp->index = 0; |
46 |
- vp->data = NULL; |
47 |
- vp->dataFreeHook = NULL; |
48 |
DEBUGDUMPSECTION("recv", "VarBind"); |
49 |
data = snmp_parse_var_op(data, objid, &vp->name_length, &vp->type, |
50 |
&vp->val_len, &var_val, length); |
51 |
if (data == NULL) |
52 |
- return -1; |
53 |
+ goto fail; |
54 |
if (snmp_set_var_objid(vp, objid, vp->name_length)) |
55 |
- return -1; |
56 |
+ goto fail; |
57 |
|
58 |
len = MAX_PACKET_LENGTH; |
59 |
DEBUGDUMPHEADER("recv", "Value"); |
60 |
@@ -4604,7 +4589,7 @@ |
61 |
vp->val.string = (u_char *) malloc(vp->val_len); |
62 |
} |
63 |
if (vp->val.string == NULL) { |
64 |
- return -1; |
65 |
+ goto fail; |
66 |
} |
67 |
p = asn_parse_string(var_val, &len, &vp->type, vp->val.string, |
68 |
&vp->val_len); |
69 |
@@ -4619,7 +4604,7 @@ |
70 |
vp->val_len *= sizeof(oid); |
71 |
vp->val.objid = (oid *) malloc(vp->val_len); |
72 |
if (vp->val.objid == NULL) { |
73 |
- return -1; |
74 |
+ goto fail; |
75 |
} |
76 |
memmove(vp->val.objid, objid, vp->val_len); |
77 |
break; |
78 |
@@ -4631,7 +4616,7 @@ |
79 |
case ASN_BIT_STR: |
80 |
vp->val.bitstring = (u_char *) malloc(vp->val_len); |
81 |
if (vp->val.bitstring == NULL) { |
82 |
- return -1; |
83 |
+ goto fail; |
84 |
} |
85 |
p = asn_parse_bitstring(var_val, &len, &vp->type, |
86 |
vp->val.bitstring, &vp->val_len); |
87 |
@@ -4640,12 +4625,28 @@ |
88 |
break; |
89 |
default: |
90 |
snmp_log(LOG_ERR, "bad type returned (%x)\n", vp->type); |
91 |
- badtype = -1; |
92 |
+ goto fail; |
93 |
break; |
94 |
} |
95 |
DEBUGINDENTADD(-4); |
96 |
+ |
97 |
+ if (NULL == vplast) { |
98 |
+ pdu->variables = vp; |
99 |
+ } else { |
100 |
+ vplast->next_variable = vp; |
101 |
+ } |
102 |
+ vplast = vp; |
103 |
+ vp = NULL; |
104 |
} |
105 |
- return badtype; |
106 |
+ return 0; |
107 |
+ |
108 |
+ fail: |
109 |
+ DEBUGMSGTL(("recv", "error while parsing VarBindList\n")); |
110 |
+ /** if we were parsing a var, remove it from the pdu and free it */ |
111 |
+ if (vp) |
112 |
+ snmp_free_var(vp); |
113 |
+ |
114 |
+ return -1; |
115 |
} |
116 |
|
117 |
/* |