int FUN_00404d68(int param_1,int *param_2,undefined4 param_3,int param_4,int param_5)
{
undefined4 *puVar1;
int iVar2;
undefined4 uVar3;
int *piVar4;
int iVar5;
undefined4 *puVar6;
int iVar7;
time_t tVar8;
int *piVar9;
int iVar10;
undefined4 local_50;
undefined4 *local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
int local_30;
undefined4 *local_2c;
iVar10 = param_4 + 8;
iVar2 = FUN_00404330(iVar10,0,*(undefined4 *)(param_1 + 8),*(undefined4 *)(param_1 + 0xc));
if (iVar2 != 0) {
uVar3 = FUN_00404404(iVar2);
dprintf(7,"make_ia","we have a binding already: %s",uVar3);
FUN_00404500(iVar2);
local_40 = *(undefined4 *)(param_1 + 0xc);
local_3c = 0;
local_38 = 0;
FUN_00403448(&local_40,iVar2 + 0x1c,param_4);
iVar10 = dhcp6_add_listval(param_3,*(undefined4 *)(param_1 + 8),&local_40,iVar2 + 0x1c);
if (iVar10 == 0) {
dprintf(5,"make_ia","failed to copy binding info");
return 0;
}
for (piVar9 = *(int **)(iVar2 + 0x1c); piVar9 != (int *)0x0; piVar9 = (int *)*piVar9) {
piVar4 = (int *)dhcp6_find_listval(param_2,piVar9[2],piVar9 + 3,0);
if (piVar4 != (int *)0x0) {
iVar2 = *piVar4;
if (iVar2 == 0) {
param_2[1] = piVar4[1];
}
else {
*(int *)(iVar2 + 4) = piVar4[1];
}
*(int *)piVar4[1] = iVar2;
dhcp6_clear_listval();
}
}
return 1;
}
piVar9 = (int *)*param_2;
if (piVar9 == (int *)0x0) {
if (*(int *)(param_1 + 8) != 6) {
return 0;
}
if (*(int *)(param_4 + 0x24) == 0) {
return 0;
}
}
piVar4 = *(int **)(param_1 + 0x28);
local_4c = &local_50;
local_50 = 0;
local_2c = local_4c;
if (piVar4 == (int *)0x0) {
LAB_0040511c:
if (piVar9 == (int *)0x0) {
if (*(int *)(param_1 + 8) != 6) {
return 0;
}
if (*(int *)(param_4 + 0x24) == 0) {
return 0;
}
iVar2 = FUN_00404a7c(param_4 + 0x24,0,local_2c);
if (iVar2 == 0) {
return 0;
}
iVar2 = 1;
}
else {
while ((*(int *)(param_1 + 8) == 6 && (iVar2 = is_leased(piVar9 + 5), iVar2 != 0))) {
piVar9 = (int *)*piVar9;
if (piVar9 == (int *)0x0) {
return 0;
}
}
iVar2 = dhcp6_add_listval(local_2c,piVar9[2],piVar9 + 3,0);
if (iVar2 == 0) {
return 0;
}
iVar2 = *piVar9;
if (iVar2 == 0) {
param_2[1] = piVar9[1];
}
else {
*(int *)(iVar2 + 4) = piVar9[1];
}
*(int *)piVar9[1] = iVar2;
dhcp6_clear_listval(piVar9);
iVar2 = 1;
}
}
else {
local_30 = param_4 + 0x24;
iVar2 = 0;
LAB_00404fe4:
do {
if (piVar4[2] != 2) {
if (*param_2 == 0) {
if ((*(int *)(param_1 + 8) == 6) && (*(int *)(param_4 + 0x24) != 0)) {
iVar5 = FUN_00404a7c(local_30,piVar4,local_2c);
if (iVar5 == 0) {
return 0;
}
piVar4 = (int *)*piVar4;
iVar2 = iVar2 + 1;
if (piVar4 == (int *)0x0) break;
goto LAB_00404fe4;
}
}
else {
piVar9 = (int *)dhcp6_find_listval(param_2,piVar4[2],piVar4 + 3,0);
if (piVar9 == (int *)0x0) {
if (piVar4[2] == 5) {
piVar9 = (int *)dhcp6_find_listval(param_2,5,piVar4 + 3,1);
if (piVar9 != (int *)0x0) goto LAB_00404f78;
}
else if (piVar4[2] == 7) {
is_leased(piVar4 + 5);
}
else {
dprintf(3,"make_match_ia","unsupported IA type");
}
}
else {
LAB_00404f78:
iVar5 = dhcp6_add_listval(local_2c,piVar9[2],piVar9 + 3,0);
if (iVar5 != 0) {
iVar5 = *piVar9;
if (iVar5 == 0) {
param_2[1] = piVar9[1];
}
else {
*(int *)(iVar5 + 4) = piVar9[1];
}
*(int *)piVar9[1] = iVar5;
dhcp6_clear_listval(piVar9);
iVar2 = iVar2 + 1;
}
}
}
}
piVar4 = (int *)*piVar4;
} while (piVar4 != (int *)0x0);
if (iVar2 == 0) {
piVar9 = (int *)*param_2;
goto LAB_0040511c;
}
}
local_40 = *(undefined4 *)(param_1 + 0xc);
local_3c = 0;
local_38 = 0;
FUN_00403448(&local_40,local_2c,param_4);
if (param_5 == 0) {
LAB_0040508c:
iVar10 = dhcp6_add_listval(param_3,*(undefined4 *)(param_1 + 8),&local_40,local_2c);
if (iVar10 == 0) {
iVar2 = 0;
}
}
else {
iVar5 = *(int *)(param_1 + 8);
uVar3 = *(undefined4 *)(param_1 + 0xc);
puVar6 = (undefined4 *)malloc(0x30) //possible issue identified - semgrep
if (puVar6 == (undefined4 *)0x0) {
dprintf(5,"add_binding","failed to allocate memory");
}
else {
*puVar6 = 0;
puVar6[1] = 0;
puVar6[3] = 0;
puVar6[4] = 0;
puVar6[5] = 0;
puVar6[6] = 0;
puVar6[7] = 0;
puVar6[8] = 0;
puVar6[9] = 0;
puVar6[10] = 0;
puVar6[0xb] = 0;
puVar6[2] = 0;
iVar7 = duidcpy(puVar6 + 3,iVar10);
if (iVar7 == 0) {
puVar6[7] = 0;
puVar6[8] = puVar6 + 7;
puVar6[6] = uVar3;
puVar6[5] = iVar5;
iVar7 = dhcp6_copy_list(puVar6 + 7,local_2c);
if (iVar7 == 0) {
if (iVar5 != 6) {
LAB_004052f4:
tVar8 = time((time_t *)0x0);
puVar6[10] = tVar8;
FUN_0040330c(puVar6);
if (puVar6[9] != -1) {
iVar10 = dhcp6_add_timer(FUN_004056b4,puVar6);
puVar6[0xb] = iVar10;
if (iVar10 == 0) {
dprintf(5,"add_binding","failed to add timer");
goto LAB_00405508;
}
local_48 = 0xffffffff;
local_44 = 0;
dhcp6_set_timer(&local_48,iVar10);
}
*puVar6 = 0;
*DAT_00439604 = puVar6;
puVar1 = puVar6;
puVar6[1] = DAT_00439604;
DAT_00439604 = puVar1;
uVar3 = FUN_00404404(puVar6);
dprintf(7,"add_binding","add a new binding %s",uVar3);
goto LAB_0040508c;
}
piVar9 = (int *)puVar6[7];
if (piVar9 != (int *)0x0) {
do {
piVar4 = (int *)*piVar9;
if (piVar9[2] == 7) {
iVar5 = lease_address(piVar9 + 5,iVar10);
if (iVar5 == 0) {
uVar3 = in6addr2str(piVar9 + 5,0);
dprintf(5,"add_binding","cannot lease address %s",uVar3);
iVar5 = *piVar9;
if (iVar5 == 0) {
puVar6[8] = piVar9[1];
iVar5 = *piVar9;
}
else {
*(int *)(iVar5 + 4) = piVar9[1];
}
*(int *)piVar9[1] = iVar5;
dhcp6_clear_listval(piVar9);
}
}
else {
dprintf(3,"add_binding","unexpected binding value type(%d)",piVar9[2]);
}
piVar9 = piVar4;
} while (piVar4 != (int *)0x0);
if (puVar6[7] != 0) goto LAB_004052f4;
}
dprintf(5,"add_binding","cannot lease any address");
}
else {
dprintf(5,"add_binding","failed to copy binding data");
}
}
else {
dprintf(5,"add_binding","failed to copy DUID");
}
LAB_00405508:
FUN_00404c30(puVar6);
}
dprintf(5,"make_ia","failed to make a binding");
iVar2 = 0;
}
dhcp6_clear_list(local_2c);
return iVar2;
}