Blame snmplib/check_varbind.c

Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
#include <net-snmp/net-snmp-features.h>
Packit fcad23
Packit fcad23
#include <net-snmp/library/check_varbind.h>
Packit fcad23
Packit fcad23
netsnmp_feature_child_of(check_varbind_all, libnetsnmp)
Packit fcad23
Packit fcad23
netsnmp_feature_child_of(check_vb_range, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_size_range, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_uint, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_storagetype, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_oid, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_type_and_max_size, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_type_and_max_size, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_rowstatus_with_storagetype, check_varbind_all)
Packit fcad23
netsnmp_feature_child_of(check_vb_truthvalue, check_varbind_all)
Packit fcad23
Packit fcad23
#ifdef NETSNMP_FEATURE_REQUIRE_CHECK_VB_ROWSTATUS_WITH_STORAGETYPE
Packit fcad23
netsnmp_feature_require(check_rowstatus_with_storagetype_transition)
Packit fcad23
#endif /* NETSNMP_FEATURE_REQUIRES_CHECK_VB_ROWSTATUS_WITH_STORAGETYPE */
Packit fcad23
#ifdef NETSNMP_FEATURE_REQUIRE_CHECK_VB_STORAGETYPE
Packit fcad23
netsnmp_feature_require(check_storage_transition)
Packit fcad23
#endif /* NETSNMP_FEATURE_REQUIRE_CHECK_VB_STORAGETYPE */
Packit fcad23
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_type(const netsnmp_variable_list *var, int type )
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if (var->type != type) {
Packit fcad23
        rc = SNMP_ERR_WRONGTYPE;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_size(const netsnmp_variable_list *var, size_t size )
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    else if (var->val_len != size) {
Packit fcad23
        rc = SNMP_ERR_WRONGLENGTH;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_max_size(const netsnmp_variable_list *var, size_t size )
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    else if (var->val_len > size) {
Packit fcad23
        rc = SNMP_ERR_WRONGLENGTH;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_RANGE
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_range(const netsnmp_variable_list *var,
Packit fcad23
                       size_t low, size_t high )
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if (((size_t)*var->val.integer < low) || ((size_t)*var->val.integer > high)) {
Packit fcad23
        rc = SNMP_ERR_WRONGVALUE;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_RANGE */
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_SIZE_RANGE
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_size_range(const netsnmp_variable_list *var,
Packit fcad23
                            size_t low, size_t high )
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((var->val_len < low) || (var->val_len > high)) {
Packit fcad23
        rc = SNMP_ERR_WRONGLENGTH;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_SIZE_RANGE */
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_type_and_size(const netsnmp_variable_list *var,
Packit fcad23
                               int type, size_t size)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type(var,type)))
Packit fcad23
        ;
Packit fcad23
    else
Packit fcad23
        rc = netsnmp_check_vb_size(var, size);
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_TYPE_AND_MAX_SIZE
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_type_and_max_size(const netsnmp_variable_list *var,
Packit fcad23
                               int type, size_t size)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type(var,type)))
Packit fcad23
        ;
Packit fcad23
    else
Packit fcad23
        rc = netsnmp_check_vb_max_size(var, size);
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_TYPE_AND_MAX_SIZE */
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_OID
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_oid(const netsnmp_variable_list *var)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type(var,ASN_OBJECT_ID)))
Packit fcad23
        ;
Packit fcad23
    else
Packit fcad23
        rc = netsnmp_check_vb_max_size(var, MAX_OID_LEN*sizeof(oid));
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_OID */
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_int(const netsnmp_variable_list *var)
Packit fcad23
{
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    return netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long));
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_UINT
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_uint(const netsnmp_variable_list *var)
Packit fcad23
{
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    return netsnmp_check_vb_type_and_size(var, ASN_UNSIGNED, sizeof(long));
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_UINT */
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_int_range(const netsnmp_variable_list *var, int low, int high)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
    
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
Packit fcad23
        return rc;
Packit fcad23
    
Packit fcad23
    if ((*var->val.integer < low) || (*var->val.integer > high)) {
Packit fcad23
        rc = SNMP_ERR_WRONGVALUE;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_TRUTHVALUE
Packit fcad23
int
Packit fcad23
netsnmp_check_vb_truthvalue(const netsnmp_variable_list *var)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
    
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
Packit fcad23
        return rc;
Packit fcad23
    
Packit fcad23
    return netsnmp_check_vb_int_range(var, 1, 2);
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_TRUTHVALUE */
Packit fcad23
Packit fcad23
NETSNMP_INLINE int
Packit fcad23
netsnmp_check_vb_rowstatus_value(const netsnmp_variable_list *var)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
Packit fcad23
        return rc;
Packit fcad23
    
Packit fcad23
    if (*var->val.integer == RS_NOTREADY)
Packit fcad23
        return SNMP_ERR_WRONGVALUE;
Packit fcad23
Packit fcad23
    return netsnmp_check_vb_int_range(var, SNMP_ROW_NONEXISTENT,
Packit fcad23
                                      SNMP_ROW_DESTROY);
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
netsnmp_check_vb_rowstatus(const netsnmp_variable_list *var, int old_value)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_rowstatus_value(var)))
Packit fcad23
        return rc;
Packit fcad23
Packit fcad23
    return check_rowstatus_transition(old_value, *var->val.integer);
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_ROWSTATUS_WITH_STORAGETYPE
Packit fcad23
int
Packit fcad23
netsnmp_check_vb_rowstatus_with_storagetype(const netsnmp_variable_list *var,
Packit fcad23
                                            int old_value, int old_storage)
Packit fcad23
{
Packit fcad23
    register int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
Packit fcad23
    if ((rc = netsnmp_check_vb_rowstatus_value(var)))
Packit fcad23
        return rc;
Packit fcad23
Packit fcad23
    return check_rowstatus_with_storagetype_transition(old_value,
Packit fcad23
                                                       *var->val.integer,
Packit fcad23
                                                       old_storage);
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_ROWSTATUS_WITH_STORAGETYPE */
Packit fcad23
Packit fcad23
#ifndef NETSNMP_FEATURE_REMOVE_CHECK_VB_STORAGETYPE
Packit fcad23
int
Packit fcad23
netsnmp_check_vb_storagetype(const netsnmp_variable_list *var, int old_value)
Packit fcad23
{
Packit fcad23
    int rc = SNMP_ERR_NOERROR;
Packit fcad23
Packit fcad23
    if (NULL == var)
Packit fcad23
        return SNMP_ERR_GENERR;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
Packit fcad23
        return rc;
Packit fcad23
    
Packit fcad23
    if ((rc = netsnmp_check_vb_int_range(var, SNMP_STORAGE_NONE,
Packit fcad23
                                        SNMP_STORAGE_READONLY)))
Packit fcad23
        return rc;
Packit fcad23
        
Packit fcad23
    return check_storage_transition(old_value, *var->val.integer);
Packit fcad23
}
Packit fcad23
#endif /* NETSNMP_FEATURE_REMOVE_CHECK_VB_STORAGETYPE */