r16804 | magfr | 2008-02-14 02:37:48 +0300 (Чтв, 14 Фев 2008) | 2 lines NEWS: snmplib: Change CONTAINER_INSERT to not do partial inserts in containers with multiple indices when one insert fails. http://sourceforge.net/tracker/index.php?func=detail&aid=1733344&group_id=12694&atid=112694 http://bugs.gentoo.org/show_bug.cgi?id=203127 Index: snmplib/container.c =================================================================== --- snmplib/container.c (revision 16803) +++ snmplib/container.c (revision 16804) @@ -282,31 +282,41 @@ * These functions should EXACTLY match the inline version in * container.h. If you change one, change them both. */ -int CONTAINER_INSERT(netsnmp_container *x, const void *k) -{ - int rc2, rc = 0; - - /** start at first container */ - while(x->prev) - x = x->prev; - for(; x; x = x->next) { - if ((NULL != x->insert_filter) && - (x->insert_filter(x,k) == 1)) - continue; - rc2 = x->insert(x,k); - if (rc2) { +int CONTAINER_INSERT_HELPER(netsnmp_container* x, const void* k) +{ + while(x && x->insert_filter && x->insert_filter(x,k) == 1) + x = x->next; + if(x) { + int rc = x->insert(x,k); + if(rc) snmp_log(LOG_ERR,"error on subcontainer '%s' insert (%d)\n", - x->container_name ? x->container_name : "", rc2); - rc = rc2; + x->container_name ? x->container_name : "", rc); + else { + rc = CONTAINER_INSERT_HELPER(x->next, k); + if(rc) + x->remove(x,k); } + return rc; } - return rc; + return 0; } /*------------------------------------------------------------------ * These functions should EXACTLY match the inline version in * container.h. If you change one, change them both. */ +int CONTAINER_INSERT(netsnmp_container* x, const void* k) +{ + /** start at first container */ + while(x->prev) + x = x->prev; + return CONTAINER_INSERT_HELPER(x, k); +} + +/*------------------------------------------------------------------ + * These functions should EXACTLY match the inline version in + * container.h. If you change one, change them both. + */ int CONTAINER_REMOVE(netsnmp_container *x, const void *k) { int rc2, rc = 0; Index: include/net-snmp/library/container.h =================================================================== --- include/net-snmp/library/container.h (revision 16803) +++ include/net-snmp/library/container.h (revision 16804) @@ -364,32 +364,43 @@ * container.c. If you change one, change them both. */ NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */ - int CONTAINER_INSERT(netsnmp_container *x, const void *k) + int CONTAINER_INSERT_HELPER(netsnmp_container* x, const void* k) { - int rc2, rc = 0; - - /** start at first container */ - while(x->prev) - x = x->prev; - for(; x; x = x->next) { - if ((NULL != x->insert_filter) && - (x->insert_filter(x,k) == 1)) - continue; - rc2 = x->insert(x,k); - if (rc2) { + while(x && x->insert_filter && x->insert_filter(x,k) == 1) + x = x->next; + if(x) { + int rc = x->insert(x,k); + if(rc) snmp_log(LOG_ERR,"error on subcontainer '%s' insert (%d)\n", - x->container_name ? x->container_name : "", rc2); - rc = rc2; + x->container_name ? x->container_name : "", rc); + else { + rc = CONTAINER_INSERT_HELPER(x->next, k); + if(rc) + x->remove(x,k); } + return rc; } - return rc; + return 0; } - + /*------------------------------------------------------------------ * These functions should EXACTLY match the function version in * container.c. If you change one, change them both. */ NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */ + int CONTAINER_INSERT(netsnmp_container* x, const void* k) + { + /** start at first container */ + while(x->prev) + x = x->prev; + return CONTAINER_INSERT_HELPER(x, k); + } + + /*------------------------------------------------------------------ + * These functions should EXACTLY match the function version in + * container.c. If you change one, change them both. + */ + NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */ int CONTAINER_REMOVE(netsnmp_container *x, const void *k) { int rc2, rc = 0;