snprintf overflow

Started by user318, December 05, 2011, 06:44:12 PM

Previous topic - Next topic

user318

У меня netxmsd аварийно завершается при определённых действиях. Дебаг-символы и бектрейс показали, что валится на вызове _sntprintf.

src/server/core/subnet.cpp, функция void Subnet::setCorrectMask(DWORD dwAddr, DWORD dwMask):

                // Change name
                _sntprintf(m_szName, 128, _T("%s/%d"), IpToStr(dwAddr, szBuffer), BitsInMask(dwMask));


Как я понял из src/server/include/nms_objects.h определение m_szName (наследуется Subnet от NetObj) такое:
TCHAR m_szName[MAX_OBJECT_NAME];

MAX_OBJECT_NAME нашёл в include/nxlog.h:
#define MAX_OBJECT_NAME          64

Где что менять теперь? :)

user318

Сюда до кучи запощу. При компиляции gentoo выдаёт диагностику напарсенную из компиляции видимо. Там в том числе и про snprintf было. Так же там есть про:
src/server/tools/nxdbmgr/upgrade.cpp

static struct
{
   int version;
   int newVersion;
   BOOL (* fpProc)(int, int);
} m_dbUpgradeMap[] =
{
   { 14, 15, H_UpgradeFromV14 },
...
        { 243, 244, H_UpgradeFromV243 },
   { 0, NULL }
};

NULL здесь не очень красиво выглядит.

user318

src/agent/core/policy.cpp:107
                DWORD size = msg->GetVariableBinary(VID_CONFIG_FILE_DATA, 0, NULL);
Оно говорит, что GetVariableBinary(DWORD, BYTE*, DWORD), а 3-м аргументом в качестве DWORD передаётся NULL.

user318

src/agent/subagents/linux/drbd.cpp:120:
                                nx_strncpy(s_drbdVersion, &line[pmatch[1].rm_so], 64);

В том же файле выше:
static char s_drbdVersion[32] = "0.0.0";

Victor Kirhenshtein

Pervij i poslednij uze bili v trunke popravleni, ostal'noe popravil, spasibo. Segodnja vecherom vilozu nakonec 1.1.7, tam vse budet ispravleno uze.

user318

Ещё нашёл:
src/server/core/userdb_objects.cpp:66
        nx_strncpy(m_name, name, MAX_OBJECT_NAME);
А m_name имеет размер MAX_USER_NAME.

Victor Kirhenshtein