Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

204 lines
4.7 KiB

/*++
Copyright (c) 1992-1997 Microsoft Corporation
Module Name:
vbl.c
Abstract:
Contains routines to manipulate variable binding lists.
SnmpUtilVarBindListCpy
SnmpUtilVarBindListFree
Environment:
User Mode - Win32
Revision History:
--*/
///////////////////////////////////////////////////////////////////////////////
// //
// Include files //
// //
///////////////////////////////////////////////////////////////////////////////
#include <snmp.h>
#include <snmputil.h>
#include <limits.h>
///////////////////////////////////////////////////////////////////////////////
// //
// Public Procedures //
// //
///////////////////////////////////////////////////////////////////////////////
SNMPAPI
SNMP_FUNC_TYPE
SnmpUtilVarBindListCpy(
SnmpVarBindList * pVblDst,
SnmpVarBindList * pVblSrc
)
/*++
Routine Description:
Copies a variable binding list.
Arguments:
pVblDst - pointer to structure to receive VarBindList.
pVblSrc - pointer to VarBindList to copy.
Return Values:
Returns SNMPAPI_NOERROR if successful.
--*/
{
UINT i;
SNMPAPI nResult = SNMPAPI_ERROR;
// validate pointer
if (pVblDst != NULL) {
// initialize
pVblDst->list = NULL;
pVblDst->len = 0;
// check for varbinds
if ((pVblSrc != NULL) &&
(pVblSrc->list != NULL) &&
(pVblSrc->len != 0)) {
// check for arithmetic overflow
if (pVblSrc->len > UINT_MAX/sizeof(SnmpVarBind)) {
SNMPDBG((
SNMP_LOG_ERROR,
"SNMP: API: pVblSrc->len 0x%x will overflow\n",
pVblSrc->len
));
SetLastError(SNMP_MEM_ALLOC_ERROR);
return nResult;
}
// attempt to allocate varbinds
pVblDst->list = SnmpUtilMemAlloc(
pVblSrc->len * sizeof(SnmpVarBind)
);
// validate pointer
if (pVblDst->list != NULL) {
// loop through the varbinds
for (i = 0; i < pVblSrc->len; i++) {
// copy individual varbind
nResult = SnmpUtilVarBindCpy(
&pVblDst->list[i],
&pVblSrc->list[i]
);
// validate return code
if (nResult == SNMPAPI_NOERROR) {
// increment
pVblDst->len++; // success...
} else {
break; // failure...
}
}
} else {
SNMPDBG((
SNMP_LOG_ERROR,
"SNMP: API: could not allocate varbinds.\n"
));
SetLastError(SNMP_MEM_ALLOC_ERROR);
}
} else {
SNMPDBG((
SNMP_LOG_WARNING,
"SNMP: API: copying null varbindlist.\n"
));
nResult = SNMPAPI_NOERROR; // success..,
}
} else {
SNMPDBG((
SNMP_LOG_ERROR,
"SNMP: API: null varbindlist pointer.\n"
));
SetLastError(ERROR_INVALID_PARAMETER);
}
// make sure we cleanup
if (nResult == SNMPAPI_ERROR) {
// release new varbinds
SnmpUtilVarBindListFree(pVblDst);
}
return nResult;
}
VOID
SNMP_FUNC_TYPE
SnmpUtilVarBindListFree(
SnmpVarBindList * pVbl
)
/*++
Routine Description:
Frees memory associated with variable binding list.
Arguments:
pVbl - pointer to VarBindList to free.
Return Values:
None.
--*/
{
UINT i;
// loop throught varbinds
for (i = 0; i < pVbl->len; i++) {
// release individual varbind
SnmpUtilVarBindFree(&pVbl->list[i]);
}
// release actual list
SnmpUtilMemFree(pVbl->list);
// re-initialize
pVbl->list = NULL;
pVbl->len = 0;
}