undefined4
update_prefix(undefined4 param_1,uint *param_2,undefined4 param_3,int param_4,undefined4 *param_5,
undefined4 param_6)
{
byte bVar1;
bool bVar2;
time_t tVar3;
int iVar4;
int iVar5;
uint uVar6;
int iVar7;
undefined4 uVar8;
undefined4 *puVar9;
uint uVar10;
uint uVar11;
byte *pbVar12;
undefined4 *puVar13;
uint uVar14;
uint uVar15;
uint uVar16;
byte *pbVar17;
undefined4 *puVar18;
char *pcVar19;
int *piVar20;
byte *pbVar21;
undefined4 local_40;
int local_3c [3];
int local_30;
puVar9 = (undefined4 *)*param_5;
if ((param_2[1] != 0xffffffff) && ((*param_2 == 0xffffffff || (param_2[1] < *param_2)))) {
uVar8 = in6addr2str(param_2 + 2,0);
dprintf(6,"update_prefix","invalid prefix %s/%d: pltime (%lu) is larger than vltime (%lu)",uVar8
,param_2[6],*param_2,param_2[1]);
return 0xffffffff;
}
if (puVar9 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)malloc(0x30) //possible issue identified - semgrep
if (puVar9 == (undefined4 *)0x0) goto LAB_00414124;
*puVar9 = param_1;
puVar9[1] = param_6;
puVar9[2] = &LAB_00413710;
puVar9[3] = FUN_0041371c;
puVar9[8] = FUN_0041420c;
puVar9[4] = &LAB_004142b8;
puVar9[9] = param_3;
puVar9[0xb] = puVar9 + 10;
*param_5 = puVar9;
puVar9[7] = &LAB_004142b8;
puVar9[6] = &LAB_004142b8;
puVar9[5] = &LAB_004142b8;
puVar9[10] = 0;
}
puVar18 = (undefined4 *)puVar9[10];
if (puVar18 != (undefined4 *)0x0) {
do {
if ((((puVar18[4] == param_2[2]) && (puVar18[5] == param_2[3])) && (puVar18[6] == param_2[4]))
&& ((puVar18[7] == param_2[5] && (puVar18[8] == param_2[6])))) {
tVar3 = time((time_t *)0x0);
uVar10 = *param_2;
uVar14 = param_2[1];
puVar18[9] = tVar3;
puVar18[2] = uVar10;
puVar18[3] = uVar14;
pcVar19 = "update";
bVar2 = false;
goto LAB_00413a8c;
}
puVar18 = (undefined4 *)*puVar18;
} while (puVar18 != (undefined4 *)0x0);
}
puVar18 = (undefined4 *)malloc(0x38) //possible issue identified - semgrep
if (puVar18 != (undefined4 *)0x0) {
*puVar18 = 0;
puVar18[1] = 0;
puVar18[4] = 0;
puVar18[5] = 0;
puVar18[6] = 0;
puVar18[7] = 0;
puVar18[8] = 0;
puVar18[0xb] = 0;
puVar18[0xc] = 0;
puVar18[0xd] = 0;
puVar18[2] = 0;
puVar18[3] = 0;
puVar18[9] = 0;
puVar18[10] = 0;
uVar10 = param_2[2];
uVar14 = param_2[4];
uVar15 = param_2[5];
puVar18[5] = param_2[3];
puVar18[4] = uVar10;
puVar18[6] = uVar14;
puVar18[7] = uVar15;
uVar10 = param_2[6];
puVar18[1] = puVar9[0xb];
puVar13 = (undefined4 *)puVar9[0xb];
puVar18[8] = uVar10;
*puVar13 = puVar18;
puVar18[0xd] = puVar18 + 0xc;
puVar18[0xb] = puVar9;
puVar18[0xc] = 0;
puVar9[0xb] = puVar18;
tVar3 = time((time_t *)0x0);
uVar10 = *param_2;
uVar14 = param_2[1];
puVar18[9] = tVar3;
puVar18[2] = uVar10;
puVar18[3] = uVar14;
pcVar19 = "create";
bVar2 = true;
LAB_00413a8c:
iVar4 = in6addr2str(param_2 + 2,0);
uVar10 = param_2[6];
uVar14 = *param_2;
uVar15 = param_2[1];
dprintf(7,"update_prefix","%s a prefix %s/%d pltime=%lu, vltime=%lu",pcVar19,iVar4,uVar10,uVar14
,uVar15);
local_3c[0] = puVar18[3];
if (local_3c[0] != 0) {
if ((bVar2) && (piVar20 = *(int **)puVar9[9], piVar20 != (int *)0x0)) {
local_30 = (int)&local_40 + 2;
pbVar21 = (byte *)((int)&local_40 + 3);
do {
while( true ) {
pcVar19 = *(char **)(param_4 + 0x10);
iVar5 = strcmp((char *)piVar20[2],pcVar19);
if (iVar5 != 0) break;
dprintf(6,"update_prefix","skip %s as a prefix interface",pcVar19,iVar4,uVar10,uVar14,
uVar15);
LAB_00413c54:
piVar20 = (int *)*piVar20;
if (piVar20 == (int *)0x0) goto LAB_00413ed4;
}
puVar9 = (undefined4 *)malloc(0x48) //possible issue identified - semgrep
if (puVar9 == (undefined4 *)0x0) {
dprintf(5,"add_ifprefix","failed to allocate memory for ifprefix");
goto LAB_00413c54;
}
memset(puVar9,0,0x48) //possible issue identified - semgrep
uVar6 = param_2[2];
uVar11 = param_2[3];
uVar16 = param_2[5];
puVar9[7] = param_2[4];
puVar9[5] = uVar6;
puVar9[6] = uVar11;
puVar9[8] = uVar16;
iVar5 = piVar20[3];
uVar11 = param_2[6];
puVar9[10] = iVar5 + uVar11;
uVar6 = piVar20[5];
puVar9[2] = piVar20;
*(undefined2 *)(puVar9 + 3) = 10;
if ((uVar6 & 7) == 0) {
if (iVar5 + uVar11 + uVar6 < 0x81) {
if (0 < (int)uVar11) {
iVar4 = 0;
do {
iVar5 = iVar4 + 1;
*(undefined1 *)((int)puVar9 + iVar4 + 0x14) =
*(undefined1 *)((int)param_2 + iVar4 + 8);
iVar4 = iVar5;
} while (iVar5 != (uVar11 - 1 >> 3) + 1);
uVar6 = piVar20[5];
}
uVar10 = piVar20[4];
iVar4 = -uVar6 + 0x80;
local_40 = uVar10 << 0x18 | uVar10 >> 0x18 | (uVar10 & 0xff0000) >> 8 |
(uVar10 & 0xff00) << 8;
if (iVar4 < 0) {
iVar4 = -uVar6 + 0x87;
}
iVar5 = piVar20[3];
iVar4 = iVar4 >> 3;
pbVar12 = pbVar21;
if (7 < iVar5) {
pbVar17 = (byte *)((int)puVar9 + iVar4 + 0x13);
uVar10 = iVar5 - 8U >> 3;
do {
bVar1 = *pbVar12;
pbVar12 = pbVar12 + -1;
*pbVar17 = bVar1;
pbVar17 = pbVar17 + -1;
} while (pbVar12 != (byte *)(local_30 - uVar10));
uVar6 = iVar5 - 8;
iVar5 = (iVar5 - 8U) + uVar10 * -8;
iVar4 = (iVar4 + -1) - (uVar6 >> 3);
pbVar12 = pbVar21 + ~uVar10;
}
if (iVar5 != 0) {
*(byte *)((int)puVar9 + iVar4 + 0x13) =
*(byte *)((int)puVar9 + iVar4 + 0x13) | *pbVar12;
}
puVar9[0xb] = puVar9[3];
puVar9[0xc] = puVar9[4];
puVar9[0xd] = puVar9[5];
puVar9[0xe] = puVar9[6];
puVar9[0xf] = puVar9[7];
puVar9[0x10] = puVar9[8];
puVar9[0x11] = puVar9[9];
iVar4 = 0xf;
if (piVar20[5] < 0x80) {
iVar5 = (int)piVar20 + 0xf;
do {
*(undefined1 *)((int)puVar9 + iVar4 + 0x34) = *(undefined1 *)(iVar5 + 0x1c);
iVar7 = piVar20[5];
iVar4 = iVar4 + -1;
if (iVar7 < 0) {
iVar7 = iVar7 + 7;
}
iVar5 = (int)piVar20 + iVar4;
} while (iVar7 >> 3 <= iVar4);
}
iVar4 = -1;
uVar10 = 0xffffffff;
iVar5 = ifaddrconf(0,*(undefined4 *)(puVar9[2] + 8),puVar9 + 0xb,puVar9[10]);
if (iVar5 == 0) {
uVar8 = puVar18[0xd];
*puVar9 = 0;
puVar9[1] = uVar8;
puVar13 = (undefined4 *)puVar18[0xd];
puVar18[0xd] = puVar9;
*puVar13 = puVar9;
goto LAB_00413c54;
}
}
else {
iVar4 = piVar20[3];
dprintf(6,"add_ifprefix","invalid prefix length %d + %d + %d",uVar11,iVar4,uVar6);
uVar10 = uVar6;
}
}
else {
dprintf(3,"add_ifprefix","assumption failure on the length of interface ID");
}
free(puVar9);
piVar20 = (int *)*piVar20;
} while (piVar20 != (int *)0x0);
LAB_00413ed4:
local_3c[0] = puVar18[3];
}
if (local_3c[0] != 0) {
if (local_3c[0] == -1) {
if (puVar18[10] == 0) {
return 0;
}
dhcp6_remove_timer(puVar18 + 10);
return 0;
}
iVar4 = puVar18[10];
if (iVar4 == 0) {
iVar4 = dhcp6_add_timer(&LAB_0041414c,puVar18);
puVar18[10] = iVar4;
if (iVar4 == 0) {
dprintf(5,"update_prefix","failed to add prefix timer");
FUN_004137e0(puVar18);
return 0xffffffff;
}
local_3c[0] = puVar18[3];
}
local_3c[1] = 0;
dhcp6_set_timer(local_3c,iVar4);
return 0;
}
}
FUN_004137e0(puVar18);
return 0;
}
LAB_00414124:
dprintf(5,"update_prefix","memory allocation failed");
return 0xffffffff;
}