/* WARNING: Restarted to delay deadcode elimination for space: stack */
int FUN_0040b550(void *param_1,void *param_2,int param_3)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
undefined1 *puVar4;
uint uVar5;
uint uVar6;
int *piVar7;
int iVar8;
int iVar9;
undefined1 uVar10;
size_t __n;
undefined4 *__src;
undefined4 local_80;
ushort local_7c;
undefined4 local_78;
uint local_74;
uint local_70;
uint local_6c;
undefined4 local_68;
undefined4 local_64;
undefined4 local_60;
undefined4 local_5c;
undefined4 local_58;
uint local_54;
uint local_50;
undefined4 local_4c;
uint local_48;
uint local_44;
undefined1 local_40 [4];
undefined1 local_3c [4];
undefined1 local_38 [4];
undefined4 local_34;
undefined1 local_30;
if ((param_1 != (void *)0x0) && (param_2 <= param_1)) {
return -1;
}
switch(*(undefined4 *)(param_3 + 8)) {
default:
dprintf(3,"copyout_option","unknown option: code %d");
return -1;
case 2:
local_80 = 0;
local_7c = 0;
__src = &local_80;
__n = 6 //possible issue identified - semgrep
uVar10 = 0xd;
break;
case 3:
case 5:
__src = &local_4c;
local_4c = 0;
local_48 = 0;
local_44 = 0;
local_40 = (undefined1 [4])0x0;
local_3c = (undefined1 [4])0x0;
local_38 = (undefined1 [4])0x0;
local_34 = 0;
local_30 = 0;
__n = 0x1d //possible issue identified - semgrep
uVar10 = 0x1a;
break;
case 4:
__src = &local_78;
local_78 = 0;
local_74 = 0;
local_70 = 0;
local_6c = 0;
__n = 0x10 //possible issue identified - semgrep
uVar10 = 0x19;
break;
case 6:
__src = &local_78;
local_78 = 0;
local_74 = 0;
local_70 = 0;
local_6c = 0;
__n = 0x10 //possible issue identified - semgrep
uVar10 = 3;
break;
case 7:
__src = &local_68;
local_68 = 0;
local_64 = 0;
local_60 = 0;
local_5c = 0;
local_58 = 0;
local_54 = 0;
local_50 = 0;
__n = 0x1c //possible issue identified - semgrep
uVar10 = 5;
if (param_1 != (void *)0x0) goto LAB_0040b628;
iVar8 = 0;
goto LAB_0040b62c;
}
iVar8 = 0;
if (param_1 != (void *)0x0) {
LAB_0040b628:
iVar8 = (int)param_1 + __n //possible issue identified - semgrep
}
LAB_0040b62c:
iVar9 = 0;
for (piVar7 = *(int **)(param_3 + 0x28); piVar7 != (int *)0x0; piVar7 = (int *)*piVar7) {
iVar1 = FUN_0040b550(iVar8,param_2,piVar7);
if (iVar1 < 0) goto switchD_0040b744_caseD_0;
if (param_1 != (void *)0x0) {
iVar8 = iVar8 + iVar1;
}
iVar9 = iVar9 + iVar1;
}
iVar9 = iVar9 + __n //possible issue identified - semgrep
if (param_1 == (void *)0x0) {
return iVar9;
}
uVar2 = dhcp6optstr(uVar10);
dprintf(7,"copyout_option","set %s",uVar2);
if ((int)param_2 - (int)param_1 < (int)__n) {
switchD_0040b744_caseD_0:
iVar9 = -1;
}
else {
uVar3 = iVar9 - 4U & 0xffff;
uVar2 = *(undefined4 *)(param_3 + 8);
*(undefined1 *)((int)__src + 1) = uVar10;
*(char *)((int)__src + 3) = (char)uVar3;
*(undefined1 *)__src = 0;
*(char *)((int)__src + 2) = (char)(uVar3 >> 8);
switch(uVar2) {
default:
goto switchD_0040b744_caseD_0;
case 2:
local_7c = *(ushort *)(param_3 + 0xc) << 8 | *(ushort *)(param_3 + 0xc) >> 8;
break;
case 4:
case 6:
uVar6 = *(uint *)(param_3 + 0x14);
uVar3 = *(uint *)(param_3 + 0xc);
uVar5 = *(uint *)(param_3 + 0x10);
local_74 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
local_70 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
local_6c = uVar6 << 0x18 | uVar6 >> 0x18 | (uVar6 & 0xff0000) >> 8 | (uVar6 & 0xff00) << 8;
break;
case 5:
uVar3 = *(uint *)(param_3 + 0xc);
uVar5 = *(uint *)(param_3 + 0x10);
uVar6 = *(uint *)(param_3 + 0x18);
iVar8 = *(int *)(param_3 + 0x1c);
puVar4 = local_40 + 1;
local_48 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
local_44 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
local_3c = (undefined1 [4])((uint)local_3c & 0xffffff00 | *(uint *)(param_3 + 0x14) >> 0x18);
local_38 = (undefined1 [4])((uint)local_38 & 0xffffff00 | uVar6 >> 0x18);
local_34._0_1_ = (undefined1)((uint)iVar8 >> 0x18);
local_34._1_3_ = (undefined3)*(undefined4 *)(param_3 + 0x20);
local_30 = (undefined1)((uint)*(undefined4 *)(param_3 + 0x20) >> 0x18);
local_40[0] = (char)*(undefined4 *)(param_3 + 0x24);
uVar3 = (uint)puVar4 & 3;
*(uint *)(puVar4 + -uVar3) =
*(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 |
*(uint *)(param_3 + 0x14) << uVar3 * 8;
puVar4 = local_3c + 1;
uVar3 = (uint)puVar4 & 3;
*(uint *)(puVar4 + -uVar3) =
*(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 | uVar6 << uVar3 * 8;
puVar4 = local_38 + 1;
uVar3 = (uint)puVar4 & 3;
*(uint *)(puVar4 + -uVar3) =
*(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 | iVar8 << uVar3 * 8;
break;
case 7:
uVar3 = *(uint *)(param_3 + 0xc);
uVar5 = *(uint *)(param_3 + 0x10);
local_58 = *(undefined4 *)(param_3 + 0x20);
local_60 = *(undefined4 *)(param_3 + 0x18);
local_64 = *(undefined4 *)(param_3 + 0x14);
local_5c = *(undefined4 *)(param_3 + 0x1c);
local_54 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
local_50 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
}
memcpy(param_1,__src,__n) //possible issue identified - semgrep
}
return iVar9;
}