void FUN_00405430(undefined4 *param_1,uint param_2,int param_3,uint param_4)

{
  ushort uVar1;
  undefined1 uVar2;
  int iVar3;
  ushort *puVar4;
  char *pcVar5;
  undefined **ppuVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  
  param_4 = param_4 & 0xffff;
  puVar4 = *(ushort **)(param_3 + 4);
  param_1[1] = puVar4;
  uVar9 = *(uint *)(param_3 + 8);
  iVar8 = *(int *)(param_3 + 0xc);
  uVar10 = uVar9 - iVar8;
  ppuVar6 = (undefined **)(param_2 & 0xffff);
  if (uVar10 < param_4 + 4) {
    param_1 = (undefined4 *)FUN_0047082c(4);
    ppuVar6 = &PTR_PTR_FUN_004af1e0;
    pcVar5 = (char *)0x6007;
  }
  else {
    uVar1 = *puVar4;
    uVar2 = (undefined1)((uint)ppuVar6 >> 8);
    if (ppuVar6 == (undefined **)((uVar1 & 0xff) << 8 | (uint)(uVar1 >> 8))) goto LAB_004054f8;
    param_1 = (undefined4 *)FUN_0047082c(4);
    pcVar5 = (char *)0x6008;
    ppuVar6 = &PTR_PTR_FUN_004af1e0;
  }
  while( true ) {
    while( true ) {
      *param_1 = pcVar5;
      param_3 = 0;
      uVar2 = FUN_00472734();
LAB_004054f8:
      *(char *)param_1 = (char)ppuVar6;
      *(undefined1 *)((int)param_1 + 1) = uVar2;
      iVar3 = param_1[1];
      param_1[1] = iVar3 + 2;
      uVar1 = *(ushort *)(iVar3 + 2);
      uVar7 = (uVar1 & 0xff) << 8 | (uint)(uVar1 >> 8);
      *(char *)((int)param_1 + 3) = (char)uVar1;
      *(char *)((int)param_1 + 2) = (char)(uVar1 >> 8);
      if (param_4 <= uVar7) break;
      param_1 = (undefined4 *)FUN_0047082c(4);
      ppuVar6 = &PTR_PTR_FUN_004af1e0;
      pcVar5 = (char *)0x6004;
    }
    if (uVar7 + 4 <= uVar10) break;
    param_1 = (undefined4 *)FUN_0047082c(4);
    ppuVar6 = &PTR_PTR_FUN_004af2b0;
    pcVar5 = "buffer overflow error";
  }
  param_1[1] = param_1[1] + 2;
  iVar3 = *(ushort *)((int)param_1 + 2) + 4;
  uVar10 = iVar3 + iVar8;
  if (uVar10 <= uVar9) {
    *(uint *)(param_3 + 0xc) = uVar10;
    *(int *)(param_3 + 4) = *(int *)(param_3 + 4) + iVar3;
  }
  return;
}