void FUN_00404a1c(void)
{
uint uVar1;
cmsghdr *__cmsg;
int iVar2;
undefined4 uVar3;
undefined4 uVar4;
undefined4 uVar5;
int iVar6;
undefined4 *puVar7;
undefined4 *puVar8;
int iVar9;
int *piVar10;
uint uVar11;
char *pcVar12;
short sVar13;
int *piVar14;
int *piVar15;
cmsghdr *pcVar16;
int *piVar17;
undefined2 local_2218 [2];
iovec local_2214;
int local_220c;
int local_2208;
int local_2204;
int local_2200;
int local_21fc;
int local_21f8;
int local_21f4;
undefined4 local_21f0;
msghdr local_21ec;
undefined4 local_21d0;
undefined4 local_21cc;
undefined4 local_21c8;
undefined4 local_21c4;
undefined4 local_21c0;
undefined4 local_21bc;
undefined4 local_21b8;
undefined4 local_21b4;
undefined1 auStack_21b0 [128];
int local_2130 [2];
int local_2128 [2];
int local_2120;
int local_211c;
int local_2118;
int local_2110;
int local_210c;
undefined1 auStack_2108 [8];
undefined1 auStack_2100 [16];
int *local_20f0 [2];
int *local_20e8;
int *local_20e0;
int *local_20c8;
int *local_20c0;
int *local_20b8;
undefined4 local_2064;
undefined4 local_2060;
uint local_2038;
undefined1 auStack_2034 [4092];
cmsghdr local_1038 [341];
int local_38;
int *local_34;
int *local_30;
local_21ec.msg_iov = &local_2214;
local_21ec.msg_namelen = 0x80;
local_21ec.msg_control = local_1038;
local_21ec.msg_controllen = 0x1000;
local_2214.iov_len = 0x1000;
local_21ec.msg_iovlen = 1;
local_21ec.msg_flags = 0;
local_2214.iov_base = &local_2038;
local_21ec.msg_name = auStack_21b0;
uVar1 = recvmsg(sock,&local_21ec,0);
if ((int)uVar1 < 0) {
piVar17 = __errno_location();
pcVar12 = strerror(*piVar17);
dprintf(3,"client6_recv","recvmsg: %s",pcVar12);
return;
}
if ((local_21ec.msg_controllen < 0xc) ||
(pcVar16 = (cmsghdr *)0x0, __cmsg = (cmsghdr *)local_21ec.msg_control,
(cmsghdr *)local_21ec.msg_control == (cmsghdr *)0x0)) {
LAB_00404cec:
dprintf(5,"client6_recv","failed to get packet info");
return;
}
do {
while ((__cmsg->cmsg_level == 0x29 &&
((__cmsg->cmsg_type == 0x32 && (__cmsg->cmsg_len == 0x20))))) {
pcVar16 = __cmsg + 1;
__cmsg = __cmsg_nxthdr(&local_21ec,__cmsg);
if (__cmsg == (cmsghdr *)0x0) goto LAB_00404b4c;
}
__cmsg = __cmsg_nxthdr(&local_21ec,__cmsg);
} while (__cmsg != (cmsghdr *)0x0);
LAB_00404b4c:
if (pcVar16 == (cmsghdr *)0x0) goto LAB_00404cec;
iVar2 = find_ifconfbyid(pcVar16[1].cmsg_level);
if (iVar2 == 0) {
dprintf(6,"client6_recv","unexpected interface (%d)",pcVar16[1].cmsg_level);
return;
}
if (uVar1 < 4) {
dprintf(6,"client6_recv","short packet (%d bytes)",uVar1);
return;
}
uVar3 = dhcp6msgstr(local_2038 & 0xff);
uVar4 = addr2str(auStack_21b0);
uVar5 = *(undefined4 *)(iVar2 + 0x10);
dprintf(7,"client6_recv","receive %s from %s on %s",uVar3,uVar4,uVar5);
local_34 = local_2130;
dhcp6_init_options(local_34);
iVar6 = dhcp6_get_options(auStack_2034,(int)&local_2038 + uVar1,local_34);
if (iVar6 < 0) {
dprintf(6,"client6_recv","failed to parse options");
return;
}
uVar11 = local_2038 & 0xff;
if (uVar11 == 7) {
piVar17 = *(int **)(iVar2 + 8);
if (piVar17 == (int *)0x0) {
LAB_00404f30:
pcVar12 = "client6_recvreply";
LAB_00404fc0:
dprintf(6,pcVar12,"XID mismatch");
goto LAB_00404c80;
}
uVar11 = piVar17[0xe];
while ((local_2038 >> 0x18 | (local_2038 & 0xff0000) >> 8 | (local_2038 & 0xff00) << 8) !=
uVar11) {
piVar17 = (int *)*piVar17;
if (piVar17 == (int *)0x0) goto LAB_00404f30;
uVar11 = piVar17[0xe];
}
local_38 = piVar17[0xf];
if ((((4 < local_38 - 2U) && (local_38 != 8)) && (local_38 != 9)) &&
((local_38 != 1 || ((*(uint *)(iVar2 + 0x2c) & 2) == 0)))) {
dprintf(6,"client6_recvreply","unexpected reply");
goto LAB_00404c80;
}
if (local_2128[0] == 0) {
pcVar12 = "client6_recvreply";
goto LAB_00405d04;
}
if (local_2130[0] == 0) {
pcVar12 = "client6_recvreply";
goto LAB_00405d3c;
}
iVar6 = duidcmp(local_34,&DAT_0043e9f4);
if (iVar6 == 0) {
iVar6 = FUN_0040448c(piVar17[0x12],&local_2038,uVar1,local_34);
if (iVar6 == 0) {
if (((local_38 == 1) && ((*(uint *)(iVar2 + 0x2c) & 2) != 0)) && (local_2120 == 0)) {
dprintf(6,"client6_recvreply","no rapid commit");
}
else if (local_20f0[0] == (int *)0x0) {
LAB_00405758:
if (local_20c8 != (int *)0x0) {
iVar6 = 0;
piVar14 = local_20c8;
do {
uVar3 = in6addr2str(piVar14 + 3,0);
FUN_00404978("nameserver[%d] %s",iVar6,uVar3);
piVar14 = (int *)*piVar14;
iVar6 = iVar6 + 1;
} while (piVar14 != (int *)0x0);
}
if (local_20c0 != (int *)0x0) {
iVar6 = 0;
piVar14 = local_20c0;
do {
FUN_00404978("Domain search list[%d] %s",iVar6,piVar14[4]);
piVar14 = (int *)*piVar14;
iVar6 = iVar6 + 1;
} while (piVar14 != (int *)0x0);
}
if (local_20b8 != (int *)0x0) {
iVar6 = 0;
piVar14 = local_20b8;
do {
uVar3 = in6addr2str(piVar14 + 3,0);
FUN_00404978("NTP server[%d] %s",iVar6,uVar3);
piVar14 = (int *)*piVar14;
iVar6 = iVar6 + 1;
} while (piVar14 != (int *)0x0);
}
if (local_20e8 != (int *)0x0) {
iVar6 = 0;
piVar14 = local_20e8;
do {
uVar3 = in6addr2str(piVar14 + 3,0);
FUN_00404978("SIP server address[%d] %s",iVar6,uVar3);
piVar14 = (int *)*piVar14;
iVar6 = iVar6 + 1;
} while (piVar14 != (int *)0x0);
}
if (local_20e0 != (int *)0x0) {
iVar6 = 0;
piVar14 = local_20e0;
do {
FUN_00404978("SIP domain name[%d] %s",iVar6,piVar14[4]);
piVar14 = (int *)*piVar14;
iVar6 = iVar6 + 1;
} while (piVar14 != (int *)0x0);
}
if (local_38 == 2) {
iVar6 = local_2110;
if ((local_2110 == -1) && (local_210c == -1)) {
iVar6 = 0x15180;
}
iVar9 = dhcp6_add_timer(&LAB_00404090,iVar2);
*(int *)(iVar2 + 4) = iVar9;
if (iVar9 == 0) {
dprintf(4,"client6_recvreply","failed to add timer for refresh time");
}
else {
local_21f0 = 0;
local_21f4 = iVar6;
if (iVar6 < 0) {
dprintf(4,"client6_recvreply","refresh time is too large: %lu",iVar6);
local_21f4 = 0x7fffffff;
}
dhcp6_set_timer(&local_21f4,*(undefined4 *)(iVar2 + 4));
}
}
else if ((local_2110 != -1) || (local_210c != -1)) {
dprintf(6,"client6_recvreply","unexpected information refresh time option (ignored)");
}
if (((local_38 - 4U < 2) || (local_38 == 8)) &&
(piVar14 = (int *)piVar17[0x13], piVar14 != (int *)0x0)) {
do {
if (piVar14[3] == 1) {
for (piVar15 = *(int **)piVar14[4]; piVar15 != (int *)0x0; piVar15 = (int *)*piVar15
) {
iVar6 = dhcp6_find_listval(auStack_2100,6,piVar15 + 3,0);
if (iVar6 == 0) goto LAB_00405a6c;
}
}
piVar14 = (int *)*piVar14;
} while (piVar14 != (int *)0x0);
LAB_00405a6c:
piVar14 = (int *)piVar17[0x13];
if (piVar14 != (int *)0x0) {
do {
if (piVar14[3] == 0) {
for (piVar15 = *(int **)piVar14[4]; piVar15 != (int *)0x0;
piVar15 = (int *)*piVar15) {
iVar6 = dhcp6_find_listval(auStack_2108,4,piVar15 + 3,0);
if (iVar6 == 0) {
reset_ia_timer(piVar15,0,iVar2,local_2128);
}
}
}
piVar14 = (int *)*piVar14;
} while (piVar14 != (int *)0x0);
}
}
if (local_38 == 6) {
dhcp6_remove_event(piVar17);
FUN_00402a70();
}
else {
iVar6 = update_ia(0,auStack_2108,iVar2,local_2128,piVar17[0x12]);
if (iVar6 < 0) goto LAB_00404c80;
update_ia(1,auStack_2100,iVar2,local_2128,piVar17[0x12]);
dhcp6_remove_event(piVar17);
}
dprintf(7,"client6_recvreply","got an expected reply, sleeping.");
if (DAT_0043e9c0 != 0) {
DAT_0043e9c4 = 1;
FUN_004041e4(0);
unlink(PTR_s__var_run_dhcp6c_pid_0043e300) //possible issue identified - semgrep
FUN_00402a70();
}
if ((*(char **)(iVar2 + 0x44) != (char *)0x0) && (**(char **)(iVar2 + 0x44) != '\0')) {
dprintf(7,"client6_recvreply","executes %s");
client6_script(*(undefined4 *)(iVar2 + 0x44),local_38,local_34);
}
}
else {
sVar13 = (short)local_20f0[0][3] //possible issue identified - semgrep
if ((sVar13 != 1) && (piVar14 = local_20f0[0], sVar13 != 5)) {
LAB_004051b4:
if (sVar13 == 4) {
if (piVar17[0xf] == 8) {
release_choose_ia(1,auStack_2100,iVar2,local_2128);
goto LAB_004051ec;
}
}
else if ((sVar13 == 0) && (piVar17[0xf] == 9)) {
piVar14 = (int *)piVar17[0x13];
if (piVar14 != (int *)0x0) {
do {
if (piVar14[3] == 1) {
release_choose_ia(1,piVar14[4],iVar2,local_2128);
}
piVar14 = (int *)*piVar14;
} while (piVar14 != (int *)0x0);
}
LAB_004051ec:
dhcp6_remove_event(piVar17);
goto LAB_00404c80;
}
uVar3 = dhcp6_stcodestr(sVar13);
dprintf(6,"client6_recvreply","status code: %s",uVar3);
piVar14 = (int *)*piVar14;
if (piVar14 == (int *)0x0) goto LAB_00405758;
sVar13 = *(short *)(piVar14 + 3) //possible issue identified - semgrep
if ((sVar13 == 1) || (sVar13 == 5)) goto LAB_00404c80;
goto LAB_004051b4;
}
}
goto LAB_00404c80;
}
pcVar12 = "client6_recvreply";
LAB_00405ebc:
dprintf(6,pcVar12,"failed to process authentication");
goto LAB_00404c80;
}
pcVar12 = "client6_recvreply";
}
else if (uVar11 == 10) {
if (local_2128[0] == 0) {
pcVar12 = "client6_recvreconf";
LAB_00405d04:
dprintf(6,pcVar12,"no server ID option");
goto LAB_00404c80;
}
if (local_2130[0] == 0) {
pcVar12 = "client6_recvreconf";
LAB_00405d3c:
dprintf(6,pcVar12,"no client ID option");
goto LAB_00404c80;
}
iVar6 = duidcmp(local_34,&DAT_0043e9f4);
if (iVar6 == 0) {
puVar7 = (undefined4 *)malloc(0x20) //possible issue identified - semgrep
if (puVar7 != (undefined4 *)0x0) {
*puVar7 = local_2064;
puVar7[1] = local_2060;
puVar7[2] = 0;
puVar7[3] = 0;
puVar7[4] = 0;
puVar7[5] = 0;
puVar7[6] = 0;
puVar7[7] = 0;
puVar8 = (undefined4 *)malloc(0x20) //possible issue identified - semgrep
puVar7[3] = puVar8;
uVar3 = DAT_0043ea04;
if (puVar8 == (undefined4 *)0x0) {
free(puVar7);
}
else {
puVar7[6] = g_prevrd;
puVar7[7] = uVar3;
puVar8[5] = &reconfig_key;
puVar8[6] = 0x10;
*puVar8 = 0;
puVar8[1] = 0;
puVar8[2] = 0;
puVar8[3] = 0;
puVar8[4] = 0;
puVar8[7] = 0;
iVar6 = FUN_0040448c(puVar7,&local_2038,uVar1,local_34);
if (iVar6 == 0) {
if (local_2118 == 5) {
renew_all_ia(iVar2);
}
else if (local_2118 == 6) {
rebind_all_ia(iVar2);
}
else if (local_2118 == 0xb) {
FUN_004034b0(iVar2);
}
}
free(puVar7);
free((void *)puVar7[3]) //possible issue identified - semgrep
}
}
goto LAB_00404c80;
}
pcVar12 = "client6_recvreconf";
}
else {
if (uVar11 != 2) {
uVar3 = dhcp6msgstr();
uVar4 = addr2str(auStack_21b0);
dprintf(6,"client6_recv","received an unexpected message (%s) from %s",uVar3,uVar4);
goto LAB_00404c80;
}
piVar17 = *(int **)(iVar2 + 8);
if (piVar17 == (int *)0x0) {
LAB_00404fb4:
pcVar12 = "client6_recvadvert";
goto LAB_00404fc0;
}
uVar11 = piVar17[0xe];
while ((local_2038 >> 0x18 | (local_2038 & 0xff0000) >> 8 | (local_2038 & 0xff00) << 8) !=
uVar11) {
piVar17 = (int *)*piVar17;
if (piVar17 == (int *)0x0) goto LAB_00404fb4;
uVar11 = piVar17[0xe];
}
if (local_2128[0] == 0) {
pcVar12 = "client6_recvadvert";
goto LAB_00405d04;
}
local_30 = local_2128;
uVar3 = duidstr(local_2128);
dprintf(7,"client6_recvadvert","server ID: %s, pref=%d",uVar3,local_211c,uVar5);
if (local_2130[0] == 0) {
pcVar12 = "client6_recvadvert";
goto LAB_00405d3c;
}
iVar6 = duidcmp(local_34,&DAT_0043e9f4);
if (iVar6 == 0) {
puVar7 = (undefined4 *)piVar17[0x12];
local_21b4 = puVar7[7];
local_21d0 = *puVar7;
local_21cc = puVar7[1];
local_21c8 = puVar7[2];
local_21c4 = puVar7[3];
local_21c0 = puVar7[4];
local_21bc = puVar7[5];
local_21b8 = puVar7[6];
iVar6 = FUN_0040448c(&local_21d0,&local_2038,uVar1,local_34);
if (iVar6 == 0) {
piVar14 = (int *)piVar17[0x13];
if (piVar14 != (int *)0x0) {
do {
if (piVar14[3] == 0) {
local_2218[0] = 6;
pcVar12 = "NoPrefixAvail";
LAB_00405310:
iVar6 = dhcp6_find_listval(local_20f0,2,local_2218,0);
if (iVar6 != 0) {
dprintf(6,"client6_recvadvert","advertise contains %s status",pcVar12);
goto LAB_00404c80;
}
}
else if (piVar14[3] == 1) {
local_2218[0] = 2;
pcVar12 = "NoAddrsAvail";
goto LAB_00405310;
}
piVar14 = (int *)*piVar14;
} while (piVar14 != (int *)0x0);
}
if (((piVar17[0xf] != 1) || ((*(uint *)(iVar2 + 0x2c) & 2) != 0)) || (DAT_0043e9c0 != 0)) {
dprintf(6,"client6_recvadvert","unexpected advertise");
}
for (piVar14 = (int *)piVar17[0x11]; piVar14 != (int *)0x0; piVar14 = (int *)*piVar14) {
iVar6 = duidcmp(piVar14 + 4,local_30);
if (iVar6 == 0) {
uVar3 = duidstr(local_30);
dprintf(6,"client6_recvadvert","duplicated server (ID: %s)",uVar3);
goto LAB_00404c80;
}
}
puVar7 = (undefined4 *)malloc(0x110) //possible issue identified - semgrep
if (puVar7 == (undefined4 *)0x0) {
dprintf(4,"client6_recvadvert","memory allocation failed for server");
}
else {
memset(puVar7,0,0x110) //possible issue identified - semgrep
iVar6 = piVar17[0x12];
puVar7[0x42] = iVar6;
puVar8 = (undefined4 *)piVar17[0x12];
uVar5 = puVar8[2];
uVar3 = *puVar8;
uVar4 = puVar8[1];
*(undefined4 *)(iVar6 + 0xc) = local_21c4;
*(undefined4 *)(iVar6 + 0x10) = local_21c0;
*(undefined4 *)(iVar6 + 0x18) = local_21b8;
*(undefined4 *)(iVar6 + 0x1c) = local_21b4;
iVar6 = new_authparam(uVar3,uVar4,uVar5);
if (iVar6 == 0) {
dprintf(4,"client6_recvadvert","memory allocation failed for authentication parameters")
;
}
else {
piVar17[0x12] = iVar6;
dhcp6_init_options(puVar7 + 2);
iVar6 = dhcp6_copy_options(puVar7 + 2,local_34);
if (iVar6 == 0) {
if (local_211c != -1) {
puVar7[0x40] = local_211c;
}
piVar14 = (int *)piVar17[0x11];
puVar7[0x41] = 1;
piVar15 = piVar17 + 0x11;
if (piVar14 == (int *)0x0) {
iVar6 = puVar7[0x40];
}
else {
iVar6 = puVar7[0x40];
do {
piVar10 = piVar14;
if ((piVar10[0x40] != 0xff) && (piVar14 = piVar10, piVar10[0x40] < iVar6)) break;
piVar14 = (int *)*piVar10;
piVar15 = piVar10;
} while (piVar14 != (int *)0x0);
}
*puVar7 = piVar14;
*piVar15 = (int)puVar7;
if (iVar6 == 0xff) {
piVar17[0x10] = (int)puVar7;
iVar6 = duidcpy(piVar17 + 4,puVar7 + 4);
if (iVar6 == 0) {
iVar2 = FUN_004035c0(iVar2,piVar17[0x10] + 8,piVar17);
if (iVar2 == 0) {
piVar17[0xf] = 3;
piVar17[0xd] = 0;
free((void *)piVar17[0x12]);
piVar17[0x12] = puVar7[0x42];
puVar7[0x42] = 0;
client6_send(piVar17);
dhcp6_set_timeoparam(piVar17);
dhcp6_reset_timer(piVar17);
}
else {
dprintf(5,"client6_recvadvert","failed to construct request data");
}
}
else {
dprintf(5,"client6_recvadvert","can\'t copy server ID");
}
}
else if (*(int *)piVar17[0x11] == 0) {
uVar3 = dhcp6_timer_rest(piVar17[3]);
local_2204 = piVar17[8] / 1000;
local_2200 = (piVar17[8] * 1000) % 1000000;
local_21fc = piVar17[9] / 1000;
local_21f8 = (piVar17[9] * 1000) % 1000000;
timeval_sub(&local_2204,uVar3,&local_220c);
if ((local_220c < local_21fc) ||
((local_220c == local_21fc && (local_2208 <= local_21f8)))) {
timeval_sub(&local_21fc,&local_220c,&local_21f4);
}
else {
local_21f0 = 0;
local_21f4 = 0;
}
dprintf(7,"client6_recvadvert","reset timer for %s to %d.%06d",
*(undefined4 *)(iVar2 + 0x10),local_21f4,local_21f0);
dhcp6_set_timer(&local_21f4,piVar17[3]);
}
goto LAB_00404c80;
}
dprintf(3,"client6_recvadvert","failed to copy options");
if ((void *)puVar7[0x42] != (void *)0x0) {
free((void *)puVar7[0x42]);
}
}
free(puVar7);
}
goto LAB_00404c80;
}
pcVar12 = "client6_recvadvert";
goto LAB_00405ebc;
}
pcVar12 = "client6_recvadvert";
}
dprintf(6,pcVar12,"client DUID mismatch");
LAB_00404c80:
dhcp6_clear_options(local_34);
return;
}