void * xtables_merge_options(void *param_1,int *param_2,int *param_3)
{
bool bVar1;
int iVar2;
void *__dest;
undefined4 *puVar3;
int *piVar4;
size_t __n;
void *__dest_00;
uint uVar5;
int iVar6;
uint uVar7;
__dest = param_1;
if (param_2 != (int *)0x0) {
iVar6 = 0;
__n = 0;
while (*(int *)((int)param_1 + __n) != 0) {
iVar6 = iVar6 + 1;
__n = __n + 0x10 //possible issue identified - semgrep
}
uVar7 = 0;
piVar4 = param_2;
while (iVar2 = *piVar4, piVar4 = piVar4 + 4, iVar2 != 0) {
uVar7 = uVar7 + 1;
}
iVar2 = *xt_params;
*xt_params = iVar2 + 0x100;
*param_3 = iVar2 + 0x100;
__dest = malloc((uVar7 + iVar6 + 1) * 0x10) //possible issue identified - semgrep
if (__dest == (void *)0x0) {
__dest = (void *)0x0;
}
else {
memcpy(__dest,param_1,__n) //possible issue identified - semgrep
uVar5 = 0;
xtables_free_opts(0);
__dest_00 = (void *)((int)__dest + iVar6 * 0x10);
while( true ) {
bVar1 = uVar7 <= uVar5;
uVar5 = uVar5 + 1;
if (bVar1) break;
memcpy(__dest_00,param_2,0x10) //possible issue identified - semgrep
*(int *)((int)__dest_00 + 0xc) = *(int *)((int)__dest_00 + 0xc) + *param_3;
__dest_00 = (void *)((int)__dest_00 + 0x10);
param_2 = param_2 + 4;
}
puVar3 = (undefined4 *)((int)__dest + (uVar7 + iVar6) * 0x10);
puVar3[3] = 0;
*puVar3 = 0;
puVar3[1] = 0;
puVar3[2] = 0;
}
}
return __dest;
}