void do_listen(void)
{
bool bVar1;
uint uVar2;
size_t sVar3;
int iVar4;
int *piVar5;
ssize_t sVar6;
char *pcVar7;
char *pcVar8;
uint uVar9;
int iVar10;
uint uVar11;
char *pcVar12;
uint *puVar13;
timeval local_11a8;
timeval local_11a0;
sockaddr local_1198 [7];
uint auStack_1128 [4];
char acStack_1118 [16];
char acStack_1108 [32];
uint local_10e8 [15];
fd_set local_10ac;
char acStack_102c [4100];
pcVar12 = o_sockname;
memset(local_1198,0,0x6e) //possible issue identified - semgrep
local_1198[0].sa_family = 1;
strncpy(local_1198[0].sa_data,pcVar12,0x6c) //possible issue identified - semgrep
uVar2 = socket(1,1,0);
uVar11 = uVar2;
if ((int)uVar2 < 0) {
verbose("Unable to open socket!\n");
}
else {
sVar3 = strlen(local_1198[0].sa_data) //possible issue identified - semgrep
iVar4 = bind(uVar2,local_1198,sVar3 << 1) //possible issue identified - semgrep
if (iVar4 < 0) {
verbose("Unalbe to bind socket!\n");
uVar11 = 0xffffffff;
close(uVar2);
}
}
sock = uVar11;
if ((int)uVar11 < 0) {
return;
}
uVar2 = 0;
LAB_00400ed0:
for (; uVar2 < 0x20; uVar2 = uVar2 + 1) {
local_10ac.fds_bits[uVar2] = 0;
}
local_10ac.fds_bits[sock >> 5] = local_10ac.fds_bits[sock >> 5] | 1 << (sock & 0x1f);
local_11a8.tv_sec = 1;
local_11a8.tv_usec = 0;
iVar4 = select(sock + 1,&local_10ac,(fd_set *)0x0,(fd_set *)0x0,&local_11a8);
if (iVar4 < 0) goto code_r0x00400f34;
goto LAB_00400f6c;
code_r0x00400f34:
piVar5 = __errno_location();
uVar2 = 0;
if (*piVar5 == 4) goto LAB_00400ed0;
verbose("select error !!!!\n");
LAB_00400f6c:
pcVar12 = acStack_102c;
if ((local_10ac.fds_bits[sock >> 5] >> (sock & 0x1f) & 1U) == 0) goto LAB_00401558;
memset(pcVar12,0,0x1001) //possible issue identified - semgrep
sVar6 = recv(sock,pcVar12,0x1000,0) //possible issue identified - semgrep
if (sVar6 < 0) {
pcVar12 = "recv error socket! %d returned!\n";
LAB_00401548:
verbose(pcVar12,sVar6);
goto LAB_00401558;
}
verbose("recv[%s]\n",pcVar12);
iVar4 = strcmp(pcVar12,"flush");
if (iVar4 == 0) {
memset(&trigger,0,0xf80) //possible issue identified - semgrep
goto LAB_00401558;
}
memset(auStack_1128,0,0x7c) //possible issue identified - semgrep
pcVar7 = strstr(pcVar12,"NAT");
if (pcVar7 == (char *)0x0) {
strcpy(acStack_1108,o_chain) //possible issue identified - semgrep
LAB_004010b0:
pcVar7 = strchr(pcVar12,0x2c);
if (pcVar7 != (char *)0x0) {
*pcVar7 = '\0';
sVar6 = atoi(pcVar12);
if ((pcVar7[1] != '\0') && (pcVar12 = strchr(pcVar7 + 1,0x2c), pcVar12 != (char *)0x0)) {
*pcVar12 = '\0';
strncpy(acStack_1118,pcVar7 + 1,0xf) //possible issue identified - semgrep
pcVar7 = pcVar12 + 1;
if ((pcVar12[1] != '\0') && (pcVar12 = strchr(pcVar7,0x2c), pcVar12 != (char *)0x0)) {
*pcVar12 = '\0';
iVar4 = strcmp(pcVar7,"udp");
if (iVar4 == 0) {
auStack_1128[3] = auStack_1128[3] | 1;
LAB_004011e0:
do {
pcVar7 = pcVar12 + 1;
pcVar12 = strchr(pcVar7,0x2c);
if (pcVar12 != (char *)0x0) {
*pcVar12 = '\0';
}
pcVar8 = strchr(pcVar7,0x2d);
if (pcVar8 != (char *)0x0) {
*pcVar8 = '\0';
}
uVar2 = atoi(pcVar7);
uVar11 = auStack_1128[2];
if (pcVar8 == (char *)0x0) {
auStack_1128[auStack_1128[2] + 0x10] = uVar2 & 0xffff;
auStack_1128[2] = auStack_1128[2] + 1;
}
else {
uVar9 = atoi(pcVar8 + 1);
if (0xd < (int)uVar11) goto LAB_004012e8;
auStack_1128[uVar11 + 0x10] = uVar2 & 0xffff | 0x80000000;
auStack_1128[2] = uVar11 + 2;
auStack_1128[uVar11 + 0x11] = uVar9;
}
if (((pcVar12 == (char *)0x0) || (pcVar12[1] == '\0')) || (0xe < (int)auStack_1128[2])
) goto LAB_004012e8;
} while( true );
}
iVar4 = strcmp(pcVar7,"tcp");
if (iVar4 == 0) {
auStack_1128[3] = auStack_1128[3] | 2;
goto LAB_004011e0;
}
iVar4 = strcmp(pcVar7,"both");
if (iVar4 == 0) {
auStack_1128[3] = auStack_1128[3] | 3;
goto LAB_004011e0;
}
}
}
}
LAB_004012dc:
sVar6 = -1;
}
else {
pcVar7 = strchr(pcVar12,0x2c);
if (pcVar7 == (char *)0x0) goto LAB_004012dc;
*pcVar7 = '\0';
sprintf(acStack_1108,"%s.%s",o_chain,pcVar12) //possible issue identified - semgrep
pcVar12 = pcVar7 + 1;
if (pcVar7[1] != '\0') goto LAB_004010b0;
sVar6 = -1;
}
LAB_004012e8:
if (0x1f < sVar6 - 1U) {
pcVar12 = "id = %d\n";
goto LAB_00401548;
}
verbose("id = %d (count=%d)\n",sVar6,auStack_1128[2]);
verbose("chain = %s\n",acStack_1108);
verbose("ip = %s\n",acStack_1118);
verbose("flags = %08x\n",auStack_1128[3]);
puVar13 = local_10e8;
iVar4 = 0;
while (iVar4 < (int)auStack_1128[2]) {
uVar11 = *puVar13;
puVar13 = puVar13 + 1;
verbose("ports[%d] = (0x%08x) %d\n",iVar4,uVar11,uVar11 & 0xffff);
iVar4 = iVar4 + 1;
}
gettimeofday(&local_11a0,(__timezone_ptr_t)0x0);
iVar4 = sVar6 + -1;
piVar5 = &trigger + iVar4 * 0x1f;
if ((*piVar5 == 0) && ((&DAT_00412328)[iVar4 * 0x1f] == 0)) {
verbose("add: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
local_11a0.tv_sec,local_11a0.tv_usec);
build_iptable_cmd(1,auStack_1128);
LAB_004014b4:
memcpy(piVar5,auStack_1128,0x7c) //possible issue identified - semgrep
}
else {
iVar10 = strcmp(acStack_1118,&DAT_00412334 + iVar4 * 0x7c);
if (iVar10 != 0) {
piVar5 = &trigger + iVar4 * 0x1f;
verbose("remove: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108 + iVar4 * 0x7c,
&DAT_00412334 + iVar4 * 0x7c,local_11a0.tv_sec,local_11a0.tv_usec);
build_iptable_cmd(0,piVar5);
verbose("add: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
local_11a0.tv_sec,local_11a0.tv_usec);
build_iptable_cmd(1,auStack_1128);
goto LAB_004014b4;
}
}
verbose("touch: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
local_11a0.tv_sec,local_11a0.tv_usec);
iVar10 = o_timeout + local_11a0.tv_sec;
(&DAT_00412328)[iVar4 * 0x1f] = local_11a0.tv_usec;
(&trigger)[iVar4 * 0x1f] = iVar10;
LAB_00401558:
gettimeofday(&local_11a0,(__timezone_ptr_t)0x0);
iVar4 = 0;
piVar5 = &trigger;
do {
iVar10 = *piVar5;
if ((iVar10 != 0) || (piVar5[1] != 0)) {
bVar1 = local_11a0.tv_sec < iVar10;
if (local_11a0.tv_sec == iVar10) {
bVar1 = local_11a0.tv_usec < piVar5[1];
}
if (!bVar1) {
verbose("timeout: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,
&DAT_00412344 + iVar4 * 0x7c,&DAT_00412334 + iVar4 * 0x7c,local_11a0.tv_sec,
local_11a0.tv_usec);
build_iptable_cmd(0,piVar5);
memset(piVar5,0,0x7c) //possible issue identified - semgrep
}
}
iVar4 = iVar4 + 1;
piVar5 = piVar5 + 0x1f;
} while (iVar4 != 0x20);
uVar2 = 0;
goto LAB_00400ed0;
}