diff options
Diffstat (limited to 'eigrpd/eigrp_packet.c')
| -rw-r--r-- | eigrpd/eigrp_packet.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c index f20ec0ad12..3befd8a118 100644 --- a/eigrpd/eigrp_packet.c +++ b/eigrpd/eigrp_packet.c @@ -161,6 +161,7 @@ int eigrp_check_md5_digest(struct stream *s, { MD5_CTX ctx; unsigned char digest[EIGRP_AUTH_TYPE_MD5_LEN]; + unsigned char orig[EIGRP_AUTH_TYPE_MD5_LEN]; struct key *key = NULL; struct keychain *keychain; u_char *ibuf; @@ -181,7 +182,9 @@ int eigrp_check_md5_digest(struct stream *s, auth_TLV = (struct TLV_MD5_Authentication_Type *)(s->data + EIGRP_HEADER_LEN); - memset(auth_TLV->digest, 0, sizeof(auth_TLV->digest)); + memcpy(orig, auth_TLV->digest, EIGRP_AUTH_TYPE_MD5_LEN); + memset(digest, 0, EIGRP_AUTH_TYPE_MD5_LEN); + memset(auth_TLV->digest, 0, EIGRP_AUTH_TYPE_MD5_LEN); ibuf = s->data; backup_end = s->endp; @@ -219,16 +222,15 @@ int eigrp_check_md5_digest(struct stream *s, MD5Final(digest, &ctx); /* compare the two */ - if (memcmp(authTLV->digest, digest, EIGRP_AUTH_TYPE_MD5_LEN) == 0) { - zlog_debug("VSETKO OK"); - } else { + if (memcmp(orig, digest, EIGRP_AUTH_TYPE_MD5_LEN) != 0) { zlog_warn("interface %s: eigrp_check_md5 checksum mismatch", IF_NAME(nbr->ei)); return 0; } /* save neighbor's crypt_seqnum */ - nbr->crypt_seqnum = authTLV->key_sequence; + if (nbr) + nbr->crypt_seqnum = authTLV->key_sequence; return 1; } @@ -884,6 +886,7 @@ void eigrp_packet_header_init(int type, struct eigrp_interface *ei, { struct eigrp_header *eigrph; + stream_reset(s); eigrph = (struct eigrp_header *)STREAM_DATA(s); eigrph->version = (u_char)EIGRP_HEADER_VERSION; |
