version 1.8, 2019/10/08 10:00:42 |
version 1.8.2.1, 2019/10/27 20:05:12 |
|
|
struct ber_element *pdu, *varbind; |
struct ber_element *pdu, *varbind; |
size_t i; |
size_t i; |
|
|
if ((pdu = ber_add_sequence(NULL)) == NULL) |
if ((pdu = ober_add_sequence(NULL)) == NULL) |
return NULL; |
return NULL; |
if ((varbind = ber_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
if ((varbind = ober_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
SNMP_C_GETREQ, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
SNMP_C_GETREQ, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
goto fail; |
goto fail; |
for (i = 0; i < len; i++) |
for (i = 0; i < len; i++) |
varbind = ber_printf_elements(varbind, "{O0}", &oid[i]); |
varbind = ober_printf_elements(varbind, "{O0}", &oid[i]); |
if (varbind == NULL) |
if (varbind == NULL) |
goto fail; |
goto fail; |
|
|
return snmp_resolve(agent, pdu, 1); |
return snmp_resolve(agent, pdu, 1); |
fail: |
fail: |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
struct ber_element *pdu, *varbind; |
struct ber_element *pdu, *varbind; |
size_t i; |
size_t i; |
|
|
if ((pdu = ber_add_sequence(NULL)) == NULL) |
if ((pdu = ober_add_sequence(NULL)) == NULL) |
return NULL; |
return NULL; |
if ((varbind = ber_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
if ((varbind = ober_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
SNMP_C_GETNEXTREQ, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
SNMP_C_GETNEXTREQ, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
goto fail; |
goto fail; |
for (i = 0; i < len; i++) |
for (i = 0; i < len; i++) |
varbind = ber_printf_elements(varbind, "{O0}", &oid[i]); |
varbind = ober_printf_elements(varbind, "{O0}", &oid[i]); |
if (varbind == NULL) |
if (varbind == NULL) |
goto fail; |
goto fail; |
|
|
return snmp_resolve(agent, pdu, 1); |
return snmp_resolve(agent, pdu, 1); |
fail: |
fail: |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
struct ber_oid sysuptime, trap; |
struct ber_oid sysuptime, trap; |
long long ticks; |
long long ticks; |
|
|
if ((pdu = ber_add_sequence(NULL)) == NULL) |
if ((pdu = ober_add_sequence(NULL)) == NULL) |
return -1; |
return -1; |
if ((varbind = ber_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
if ((varbind = ober_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
SNMP_C_TRAPV2, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
SNMP_C_TRAPV2, arc4random() & 0x7fffffff, 0, 0)) == NULL) |
goto fail; |
goto fail; |
|
|
|
|
ticks += uptime->tv_nsec / 10000000; |
ticks += uptime->tv_nsec / 10000000; |
if (smi_string2oid("sysUpTime.0", &sysuptime) == -1) |
if (smi_string2oid("sysUpTime.0", &sysuptime) == -1) |
goto fail; |
goto fail; |
if ((varbind = ber_printf_elements(varbind, "{Oit}", &sysuptime, ticks, |
if ((varbind = ober_printf_elements(varbind, "{Oit}", &sysuptime, ticks, |
BER_CLASS_APPLICATION, SNMP_T_TIMETICKS)) == NULL) |
BER_CLASS_APPLICATION, SNMP_T_TIMETICKS)) == NULL) |
goto fail; |
goto fail; |
if (smi_string2oid("snmpTrapOID.0", &trap) == -1) |
if (smi_string2oid("snmpTrapOID.0", &trap) == -1) |
goto fail; |
goto fail; |
if ((varbind = ber_printf_elements(varbind, "{OO}", &trap, oid)) == NULL) |
if ((varbind = ober_printf_elements(varbind, "{OO}", &trap, oid)) == NULL) |
goto fail; |
goto fail; |
if (custvarbind != NULL) |
if (custvarbind != NULL) |
ber_link_elements(varbind, custvarbind); |
ober_link_elements(varbind, custvarbind); |
|
|
snmp_resolve(agent, pdu, 0); |
snmp_resolve(agent, pdu, 0); |
return 0; |
return 0; |
fail: |
fail: |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
return -1; |
return -1; |
} |
} |
|
|
|
|
struct ber_element *pdu, *varbind; |
struct ber_element *pdu, *varbind; |
size_t i; |
size_t i; |
|
|
if ((pdu = ber_add_sequence(NULL)) == NULL) |
if ((pdu = ober_add_sequence(NULL)) == NULL) |
return NULL; |
return NULL; |
if ((varbind = ber_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
if ((varbind = ober_printf_elements(pdu, "tddd{", BER_CLASS_CONTEXT, |
SNMP_C_GETBULKREQ, arc4random() & 0x7fffffff, non_repeaters, |
SNMP_C_GETBULKREQ, arc4random() & 0x7fffffff, non_repeaters, |
max_repetitions)) == NULL) |
max_repetitions)) == NULL) |
goto fail; |
goto fail; |
for (i = 0; i < len; i++) |
for (i = 0; i < len; i++) |
varbind = ber_printf_elements(varbind, "{O0}", &oid[i]); |
varbind = ober_printf_elements(varbind, "{O0}", &oid[i]); |
if (varbind == NULL) |
if (varbind == NULL) |
goto fail; |
goto fail; |
|
|
return snmp_resolve(agent, pdu, 1); |
return snmp_resolve(agent, pdu, 1); |
fail: |
fail: |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
{ |
{ |
struct ber_element *pdu; |
struct ber_element *pdu; |
|
|
if ((pdu = ber_add_sequence(NULL)) == NULL) |
if ((pdu = ober_add_sequence(NULL)) == NULL) |
return NULL; |
return NULL; |
if (ber_printf_elements(pdu, "tddd{e", BER_CLASS_CONTEXT, |
if (ober_printf_elements(pdu, "tddd{e", BER_CLASS_CONTEXT, |
SNMP_C_SETREQ, arc4random() & 0x7fffffff, 0, 0, vblist) == NULL) { |
SNMP_C_SETREQ, arc4random() & 0x7fffffff, 0, 0, vblist) == NULL) { |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
ber_free_elements(vblist); |
ober_free_elements(vblist); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
int tries; |
int tries; |
char buf[READ_BUF_SIZE]; |
char buf[READ_BUF_SIZE]; |
|
|
if (ber_scanf_elements(pdu, "{i", &reqid) != 0) { |
if (ober_scanf_elements(pdu, "{i", &reqid) != 0) { |
errno = EINVAL; |
errno = EINVAL; |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
continue; |
continue; |
} |
} |
/* Validate pdu format and check request id */ |
/* Validate pdu format and check request id */ |
if (ber_scanf_elements(pdu, "{iSSe", &rreqid, &varbind) != 0 || |
if (ober_scanf_elements(pdu, "{iSSe", &rreqid, &varbind) != 0 || |
varbind->be_encoding != BER_TYPE_SEQUENCE) { |
varbind->be_encoding != BER_TYPE_SEQUENCE) { |
errno = EPROTO; |
errno = EPROTO; |
direction = POLLOUT; |
direction = POLLOUT; |
|
|
} |
} |
for (varbind = varbind->be_sub; varbind != NULL; |
for (varbind = varbind->be_sub; varbind != NULL; |
varbind = varbind->be_next) { |
varbind = varbind->be_next) { |
if (ber_scanf_elements(varbind, "{oS}", &oid) != 0) { |
if (ober_scanf_elements(varbind, "{oS}", &oid) != 0) { |
errno = EPROTO; |
errno = EPROTO; |
direction = POLLOUT; |
direction = POLLOUT; |
tries--; |
tries--; |
|
|
void *cookie = NULL; |
void *cookie = NULL; |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
|
|
if ((message = ber_add_sequence(NULL)) == NULL) { |
if ((message = ober_add_sequence(NULL)) == NULL) { |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
goto fail; |
goto fail; |
} |
} |
|
|
switch (agent->version) { |
switch (agent->version) { |
case SNMP_V1: |
case SNMP_V1: |
case SNMP_V2C: |
case SNMP_V2C: |
if (ber_printf_elements(message, "dse", agent->version, |
if (ober_printf_elements(message, "dse", agent->version, |
agent->community, pdu) == NULL) { |
agent->community, pdu) == NULL) { |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
goto fail; |
goto fail; |
} |
} |
break; |
break; |
case SNMP_V3: |
case SNMP_V3: |
msgid = arc4random_uniform(2147483647); |
msgid = arc4random_uniform(2147483647); |
if ((scopedpdu = ber_add_sequence(NULL)) == NULL) { |
if ((scopedpdu = ober_add_sequence(NULL)) == NULL) { |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
goto fail; |
goto fail; |
} |
} |
if (ber_printf_elements(scopedpdu, "xxe", |
if (ober_printf_elements(scopedpdu, "xxe", |
agent->v3->engineid, agent->v3->engineidlen, |
agent->v3->engineid, agent->v3->engineidlen, |
agent->v3->ctxname, agent->v3->ctxnamelen, pdu) == NULL) { |
agent->v3->ctxname, agent->v3->ctxnamelen, pdu) == NULL) { |
ber_free_elements(pdu); |
ober_free_elements(pdu); |
ber_free_elements(scopedpdu); |
ober_free_elements(scopedpdu); |
goto fail; |
goto fail; |
} |
} |
pdu = NULL; |
pdu = NULL; |
if ((securityparams = agent->v3->sec->genparams(agent, |
if ((securityparams = agent->v3->sec->genparams(agent, |
&securitysize, &cookie)) == NULL) { |
&securitysize, &cookie)) == NULL) { |
ber_free_elements(scopedpdu); |
ober_free_elements(scopedpdu); |
goto fail; |
goto fail; |
} |
} |
if (agent->v3->level & SNMP_MSGFLAG_PRIV) { |
if (agent->v3->level & SNMP_MSGFLAG_PRIV) { |
if ((encpdu = agent->v3->sec->encpdu(agent, scopedpdu, |
if ((encpdu = agent->v3->sec->encpdu(agent, scopedpdu, |
cookie)) == NULL) |
cookie)) == NULL) |
goto fail; |
goto fail; |
ber_free_elements(scopedpdu); |
ober_free_elements(scopedpdu); |
scopedpdu = encpdu; |
scopedpdu = encpdu; |
} |
} |
if (ber_printf_elements(message, "d{idxd}xe", |
if (ober_printf_elements(message, "d{idxd}xe", |
agent->version, msgid, UDP_MAXPACKET, &(agent->v3->level), |
agent->version, msgid, UDP_MAXPACKET, &(agent->v3->level), |
(size_t) 1, agent->v3->sec->model, securityparams, |
(size_t) 1, agent->v3->sec->model, securityparams, |
securitysize, scopedpdu) == NULL) { |
securitysize, scopedpdu) == NULL) { |
ber_free_elements(scopedpdu); |
ober_free_elements(scopedpdu); |
goto fail; |
goto fail; |
} |
} |
if (ber_scanf_elements(message, "{SSe", &secparams) == -1) |
if (ober_scanf_elements(message, "{SSe", &secparams) == -1) |
goto fail; |
goto fail; |
ber_set_writecallback(secparams, snmp_v3_secparamsoffset, |
ober_set_writecallback(secparams, snmp_v3_secparamsoffset, |
&secparamsoffset); |
&secparamsoffset); |
break; |
break; |
} |
} |
|
|
if (ber_write_elements(&ber, message) == -1) |
if (ober_write_elements(&ber, message) == -1) |
goto fail; |
goto fail; |
ret = ber_copy_writebuf(&ber, (void **)&packet); |
ret = ber_copy_writebuf(&ber, (void **)&packet); |
|
|
*len = (size_t) ret; |
*len = (size_t) ret; |
ber_free(&ber); |
ober_free(&ber); |
|
|
if (agent->version == SNMP_V3 && packet != NULL) { |
if (agent->version == SNMP_V3 && packet != NULL) { |
if (agent->v3->sec->finalparams(agent, packet, |
if (agent->v3->sec->finalparams(agent, packet, |
|
|
fail: |
fail: |
if (agent->version == SNMP_V3) |
if (agent->version == SNMP_V3) |
agent->v3->sec->freecookie(cookie); |
agent->v3->sec->freecookie(cookie); |
ber_free_elements(message); |
ober_free_elements(message); |
free(securityparams); |
free(securityparams); |
return packet; |
return packet; |
} |
} |
|
|
void *cookie = NULL; |
void *cookie = NULL; |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
|
|
ber_set_readbuf(&ber, buf, buflen); |
ober_set_readbuf(&ber, buf, buflen); |
if ((message = ber_read_elements(&ber, NULL)) == NULL) |
if ((message = ober_read_elements(&ber, NULL)) == NULL) |
return NULL; |
return NULL; |
ber_free(&ber); |
ober_free(&ber); |
|
|
if (ber_scanf_elements(message, "{de", &version, &payload) != 0) |
if (ober_scanf_elements(message, "{de", &version, &payload) != 0) |
goto fail; |
goto fail; |
|
|
if (version != agent->version) |
if (version != agent->version) |
|
|
switch (version) { |
switch (version) { |
case SNMP_V1: |
case SNMP_V1: |
case SNMP_V2C: |
case SNMP_V2C: |
if (ber_scanf_elements(payload, "se", &community, &pdu) == -1) |
if (ober_scanf_elements(payload, "se", &community, &pdu) == -1) |
goto fail; |
goto fail; |
if (strcmp(community, agent->community) != 0) |
if (strcmp(community, agent->community) != 0) |
goto fail; |
goto fail; |
ber_unlink_elements(payload); |
ober_unlink_elements(payload); |
ber_free_elements(message); |
ober_free_elements(message); |
return pdu; |
return pdu; |
case SNMP_V3: |
case SNMP_V3: |
if (ber_scanf_elements(payload, "{idxi}pxe", &msgid, &msgsz, |
if (ober_scanf_elements(payload, "{idxi}pxe", &msgid, &msgsz, |
&msgflags, &msgflagslen, &model, &secparamsoffset, |
&msgflags, &msgflagslen, &model, &secparamsoffset, |
&secparams, &secparamslen, &scopedpdu) == -1) |
&secparams, &secparamslen, &scopedpdu) == -1) |
goto fail; |
goto fail; |
|
|
goto fail; |
goto fail; |
} |
} |
if (msgflags[0] & SNMP_MSGFLAG_PRIV) { |
if (msgflags[0] & SNMP_MSGFLAG_PRIV) { |
if (ber_scanf_elements(scopedpdu, "x", &encpdu, |
if (ober_scanf_elements(scopedpdu, "x", &encpdu, |
&encpdulen) == -1) |
&encpdulen) == -1) |
goto fail; |
goto fail; |
if ((scopedpdu = agent->v3->sec->decpdu(agent, encpdu, |
if ((scopedpdu = agent->v3->sec->decpdu(agent, encpdu, |
encpdulen, cookie)) == NULL) |
encpdulen, cookie)) == NULL) |
goto fail; |
goto fail; |
} |
} |
if (ber_scanf_elements(scopedpdu, "{xeS{", &engineid, |
if (ober_scanf_elements(scopedpdu, "{xeS{", &engineid, |
&engineidlen, &ctxname) == -1) |
&engineidlen, &ctxname) == -1) |
goto fail; |
goto fail; |
if (!agent->v3->engineidset) { |
if (!agent->v3->engineidset) { |
|
|
engineidlen) == -1) |
engineidlen) == -1) |
goto fail; |
goto fail; |
} |
} |
pdu = ber_unlink_elements(ctxname); |
pdu = ober_unlink_elements(ctxname); |
/* Accept reports, so we can continue if possible */ |
/* Accept reports, so we can continue if possible */ |
if (pdu->be_type != SNMP_C_REPORT) { |
if (pdu->be_type != SNMP_C_REPORT) { |
if ((msgflags[0] & SNMP_MSGFLAG_SECMASK) != |
if ((msgflags[0] & SNMP_MSGFLAG_SECMASK) != |
|
|
goto fail; |
goto fail; |
} |
} |
|
|
ber_free_elements(message); |
ober_free_elements(message); |
agent->v3->sec->freecookie(cookie); |
agent->v3->sec->freecookie(cookie); |
return pdu; |
return pdu; |
} |
} |
|
|
fail: |
fail: |
if (version == SNMP_V3) |
if (version == SNMP_V3) |
agent->v3->sec->freecookie(cookie); |
agent->v3->sec->freecookie(cookie); |
ber_free_elements(message); |
ober_free_elements(message); |
return NULL; |
return NULL; |
} |
} |
|
|
|
|
ssize_t ret; |
ssize_t ret; |
|
|
*buf = NULL; |
*buf = NULL; |
if ((ret = ber_get_writebuf(ber, (void **)&bbuf)) == -1) |
if ((ret = ober_get_writebuf(ber, (void **)&bbuf)) == -1) |
return -1; |
return -1; |
if ((*buf = malloc(ret)) == NULL) |
if ((*buf = malloc(ret)) == NULL) |
return -1; |
return -1; |