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