Добрый день.
Подскажите, пожалуйста, почему данная функция при переодическом выполнении вызывает рост программы в памяти и каким образом это можно исправить.
/////////////////////////////////////////////////////////////////
long getRuleCount(const char *id)
{
static int s = -1; /* the socket */
struct ip_fw *r;
#define NEXT(r) ((struct ip_fw *)((char *)r + RULESIZE(r)))
int seen = 0, nbytes;
long bytes = 0;
u_long rnum;
char rule[7];
int nalloc = 1024; /* start somewhere... */
/* get rules or pipes from kernel, resizing array as necessary */
nbytes = nalloc;
if (s == -1)
s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (s < 0)
send_error("socket error(IPFW)");
r = NULL;
while (nbytes >= nalloc)
{
nalloc = nalloc * 2 + 200;
nbytes = nalloc;
if ((r = (ip_fw*)realloc(r, nbytes)) == NULL)
{ }
sprintf(rule, "%s%s", (IPFW_PREFIX), id);
rnum = atoi(rule);
for (int n = seen = 0; n < 65535, r->rulenum <= rnum; n++, r = NEXT(r))
{
if (r->rulenum == rnum)
{
bytes += (long)r->bcnt;
seen = 1;
}
}
if (!seen)
{
char err[50];
sprintf(err, "Rule %lu does not exist", rnum);
send_error(err);
return -1;
}
#undef NEXT
return bytes;
}
send_error("Error on realloc (IPFW)");
return -1;
}
/////////////////////////////////////////////////////////////////