/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
int FUN_0041ea20(int *param_1,size_t *param_2,int param_3,undefined4 param_4,void *param_5,
code *param_6,undefined4 param_7)
{
size_t *__src;
FILE *__stream;
ssize_t sVar1;
uint uVar2;
int iVar3;
int *piVar4;
char *pcVar5;
uint uVar6;
size_t sVar7;
iovec local_4068;
undefined4 local_4060;
int local_405c;
undefined4 local_4058;
msghdr local_4054;
size_t local_4038 [4096];
size_t *local_38;
undefined4 *local_34;
msghdr *local_30;
local_4068.iov_len = *param_2;
sVar7 = param_1[7] + 1 //possible issue identified - semgrep
local_4054.msg_name = &local_4060;
local_4054.msg_namelen = 0xc;
local_4054.msg_iov = &local_4068;
local_4054.msg_iovlen = 1;
param_1[7] = sVar7;
local_4054.msg_control = (void *)0x0;
local_4054.msg_controllen = 0;
local_4054.msg_flags = 0;
local_4060 = 0x10;
param_2[2] = sVar7;
if (param_5 == (void *)0x0) {
*(ushort *)((int)param_2 + 6) = *(ushort *)((int)param_2 + 6) | 4;
}
local_30 = &local_4054;
local_4068.iov_base = param_2;
local_405c = param_3;
local_4058 = param_4;
local_34 = (undefined4 *)local_4054.msg_name;
sVar1 = sendmsg(*param_1,local_30,0);
local_38 = local_4038;
if (sVar1 < 0) {
perror("Cannot talk to rtnetlink");
}
else {
memset(local_38,0,0x4000) //possible issue identified - semgrep
local_4068.iov_base = local_38;
while( true ) {
while( true ) {
local_4068.iov_len = 0x4000;
uVar2 = recvmsg(*param_1,local_30,0);
if (-1 < (int)uVar2) break;
piVar4 = __errno_location();
__stream = _stderr;
iVar3 = *piVar4;
if ((iVar3 != 4) && (iVar3 != 0xb)) {
pcVar5 = strerror(iVar3);
fprintf(__stream,"netlink receive error %s (%d)\n",pcVar5,*piVar4);
return -1;
}
}
if (uVar2 == 0) break;
__src = local_38;
if (local_4054.msg_namelen != 0xc) {
pcVar5 = "sender address length == %d\n";
uVar6 = local_4054.msg_namelen;
goto LAB_0041ec0c;
}
for (; 0xf < uVar2; uVar2 = uVar2 - uVar6) {
uVar6 = *__src;
if (((int)(uVar6 - 0x10) < 0) || ((int)uVar2 < (int)uVar6)) {
if ((local_4054.msg_flags & 0x20U) != 0) {
fwrite("Truncated message\n",1,0x12,_stderr);
return -1;
}
pcVar5 = "!!!malformed message: len=%d\n";
goto LAB_0041ec0c;
}
if (((param_3 == local_405c) && (__src[3] == param_1[2])) && (sVar7 == __src[2])) {
if ((short)__src[1] == 2) {
if (uVar6 - 0x10 < 0x14) {
fwrite("ERROR truncated\n",1,0x10,_stderr);
return -1;
}
piVar4 = __errno_location();
sVar7 = __src[4] //possible issue identified - semgrep
*piVar4 = -sVar7;
if (-sVar7 == 0) {
if (param_5 == (void *)0x0) {
return 0;
}
memcpy(param_5,__src,*__src) //possible issue identified - semgrep
return 0;
}
perror("RTNETLINK answers");
return -1;
}
if (param_5 != (void *)0x0) {
memcpy(param_5,__src,uVar6) //possible issue identified - semgrep
return 0;
}
fwrite("Unexpected reply!!!\n",1,0x14,_stderr);
}
else if ((param_6 != (code *)0x0) && (iVar3 = (*param_6)(local_34,__src,param_7), iVar3 < 0)
) {
return iVar3;
}
uVar6 = uVar6 + 3 & 0xfffffffc;
__src = (size_t *)((int)__src + uVar6);
}
if ((local_4054.msg_flags & 0x20U) == 0) {
if (uVar2 != 0) {
pcVar5 = "!!!Remnant of size %d\n";
uVar6 = uVar2;
LAB_0041ec0c:
fprintf(_stderr,pcVar5,uVar6);
/* WARNING: Subroutine does not return */
exit(1);
}
}
else {
fwrite("Message truncated\n",1,0x12,_stderr);
}
}
fwrite("EOF on netlink\n",1,0xf,_stderr);
}
return -1;
}