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;
}