From Luis Ontanon:

Check for duplicate entries in usmUserTable.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=2426

svn path=/trunk/; revision=32081
This commit is contained in:
Anders Broman 2010-03-02 05:44:04 +00:00
parent 0bd0d5939a
commit c4d69e4453
2 changed files with 70 additions and 18 deletions

View File

@ -1114,11 +1114,11 @@ static snmp_ue_assoc_t* localize_ue( snmp_ue_assoc_t* o, const guint8* engine, g
#define localized_match(a,u,ul,e,el) \
( a->user.userName.len == ul \
&& a->engine.len == el \
&& memcmp( a->user.userName.data, u, (a->user.userName.len < ul) ? a->user.userName.len : ul ) == 0 \
&& memcmp( a->engine.data, e, (a->engine.len < el) ? a->engine.len : el ) == 0 )
&& memcmp( a->user.userName.data, u, ul ) == 0 \
&& memcmp( a->engine.data, e, el ) == 0 )
#define unlocalized_match(a,u,l) \
( a->user.userName.len == l && memcmp( a->user.userName.data, u, a->user.userName.len < l ? a->user.userName.len : l) == 0 )
( a->user.userName.len == l && memcmp( a->user.userName.data, u, l) == 0 )
static snmp_ue_assoc_t* get_user_assoc(tvbuff_t* engine_tvb, tvbuff_t* user_tvb) {
static snmp_ue_assoc_t* a;
@ -1830,7 +1830,8 @@ static void snmp_usm_password_to_key_sha1(const guint8 *password,
}
static void process_prefs(void) {}
static void process_prefs(void) {
}
static void* snmp_users_copy_cb(void* dest, const void* orig, unsigned len _U_) {
const snmp_ue_assoc_t* o = orig;
@ -1861,7 +1862,7 @@ static void* snmp_users_copy_cb(void* dest, const void* orig, unsigned len _U_)
d->user.privKey.data = o->user.privKey.data ? g_memdup(o->user.privKey.data,o->user.privKey.len) : NULL;
d->user.privKey.len = o->user.privKey.len;
return d;
}
@ -1878,16 +1879,40 @@ static void snmp_users_free_cb(void* p) {
static void snmp_users_update_cb(void* p _U_, const char** err) {
snmp_ue_assoc_t* ue = p;
GString* es = g_string_new("");
unsigned i;
*err = NULL;
if (! ue->user.userName.len) g_string_append(es,"no userName, ");
if (! ue->user.userName.len)
g_string_append_printf(es,"no userName\n",num_ueas);
for (i=0; i<num_ueas-1; i++) {
snmp_ue_assoc_t* u = &(ueas[i]);
if ( u->user.userName.len == ue->user.userName.len
&& u->engine.len == ue->engine.len ) {
if (u->engine.len > 0 && memcmp( u->engine.data, ue->engine.data, u->engine.len ) == 0) {
if ( memcmp( u->user.userName.data, ue->user.userName.data, ue->user.userName.len ) == 0 ) {
/* XXX: make a string for the engineId */
g_string_append_printf(es,"duplicate key (userName='%s' engineId='???')\n",ue->user.userName.data);
}
}
if (u->engine.len == 0) {
if ( memcmp( u->user.userName.data, ue->user.userName.data, ue->user.userName.len ) == 0 ) {
g_string_append_printf(es,"duplicate key (userName='%s' engineId=NONE)\n",ue->user.userName.data);
}
}
}
}
if (es->len) {
g_string_truncate(es,es->len-2);
*err = ep_strdup(es->str);
}
g_string_free(es,TRUE);
return;
@ -2108,6 +2133,7 @@ void proto_register_snmp(void) {
value_sub_dissectors_table = register_dissector_table("snmp.variable_oid","SNMP Variable OID", FT_STRING, BASE_NONE);
register_init_routine(renew_ue_cache);
}

View File

@ -1216,11 +1216,11 @@ static snmp_ue_assoc_t* localize_ue( snmp_ue_assoc_t* o, const guint8* engine, g
#define localized_match(a,u,ul,e,el) \
( a->user.userName.len == ul \
&& a->engine.len == el \
&& memcmp( a->user.userName.data, u, (a->user.userName.len < ul) ? a->user.userName.len : ul ) == 0 \
&& memcmp( a->engine.data, e, (a->engine.len < el) ? a->engine.len : el ) == 0 )
&& memcmp( a->user.userName.data, u, ul ) == 0 \
&& memcmp( a->engine.data, e, el ) == 0 )
#define unlocalized_match(a,u,l) \
( a->user.userName.len == l && memcmp( a->user.userName.data, u, a->user.userName.len < l ? a->user.userName.len : l) == 0 )
( a->user.userName.len == l && memcmp( a->user.userName.data, u, l) == 0 )
static snmp_ue_assoc_t* get_user_assoc(tvbuff_t* engine_tvb, tvbuff_t* user_tvb) {
static snmp_ue_assoc_t* a;
@ -3054,7 +3054,8 @@ static void snmp_usm_password_to_key_sha1(const guint8 *password,
}
static void process_prefs(void) {}
static void process_prefs(void) {
}
static void* snmp_users_copy_cb(void* dest, const void* orig, unsigned len _U_) {
const snmp_ue_assoc_t* o = orig;
@ -3085,7 +3086,7 @@ static void* snmp_users_copy_cb(void* dest, const void* orig, unsigned len _U_)
d->user.privKey.data = o->user.privKey.data ? g_memdup(o->user.privKey.data,o->user.privKey.len) : NULL;
d->user.privKey.len = o->user.privKey.len;
return d;
}
@ -3102,16 +3103,40 @@ static void snmp_users_free_cb(void* p) {
static void snmp_users_update_cb(void* p _U_, const char** err) {
snmp_ue_assoc_t* ue = p;
GString* es = g_string_new("");
unsigned i;
*err = NULL;
if (! ue->user.userName.len) g_string_append(es,"no userName, ");
if (! ue->user.userName.len)
g_string_append_printf(es,"no userName\n",num_ueas);
for (i=0; i<num_ueas-1; i++) {
snmp_ue_assoc_t* u = &(ueas[i]);
if ( u->user.userName.len == ue->user.userName.len
&& u->engine.len == ue->engine.len ) {
if (u->engine.len > 0 && memcmp( u->engine.data, ue->engine.data, u->engine.len ) == 0) {
if ( memcmp( u->user.userName.data, ue->user.userName.data, ue->user.userName.len ) == 0 ) {
/* XXX: make a string for the engineId */
g_string_append_printf(es,"duplicate key (userName='%s' engineId='???')\n",ue->user.userName.data);
}
}
if (u->engine.len == 0) {
if ( memcmp( u->user.userName.data, ue->user.userName.data, ue->user.userName.len ) == 0 ) {
g_string_append_printf(es,"duplicate key (userName='%s' engineId=NONE)\n",ue->user.userName.data);
}
}
}
}
if (es->len) {
g_string_truncate(es,es->len-2);
*err = ep_strdup(es->str);
}
g_string_free(es,TRUE);
return;
@ -3485,7 +3510,7 @@ void proto_register_snmp(void) {
"snmp.T_operation", HFILL }},
/*--- End of included file: packet-snmp-hfarr.c ---*/
#line 2000 "packet-snmp-template.c"
#line 2025 "packet-snmp-template.c"
};
/* List of subtrees */
@ -3525,7 +3550,7 @@ void proto_register_snmp(void) {
&ett_snmp_RReqPDU_U,
/*--- End of included file: packet-snmp-ettarr.c ---*/
#line 2016 "packet-snmp-template.c"
#line 2041 "packet-snmp-template.c"
};
module_t *snmp_module;
@ -3621,6 +3646,7 @@ void proto_register_snmp(void) {
value_sub_dissectors_table = register_dissector_table("snmp.variable_oid","SNMP Variable OID", FT_STRING, BASE_NONE);
register_init_routine(renew_ue_cache);
}