void attach_option(undefined4 *param_1,int param_2,void *param_3,size_t param_4)

{
  byte bVar1;
  undefined4 *puVar2;
  undefined1 *puVar3;
  void *pvVar4;
  byte *__ptr;
  undefined4 *puVar5;
  undefined4 *puVar6;
  int *piVar7;
  
  piVar7 = (int *)*param_1;
  if (piVar7 != (int *)0x0) {
    __ptr = (byte *)*piVar7;
    bVar1 = *__ptr;
    while ((int)(uint)bVar1 < (int)*(char *)(param_2 + 0x15)) {
      piVar7 = (int *)piVar7[1];
      if (piVar7 == (int *)0x0) goto LAB_00408910;
      __ptr = (byte *)*piVar7;
      bVar1 = *__ptr;
    }
    if ((int)*(char *)(param_2 + 0x15) == (uint)bVar1) {
      if ((*(byte *)(param_2 + 0x14) & 0x20) == 0) {
        return;
      }
      if (0xff < (int)(__ptr[1] + param_4)) {
        return;
      }
      pvVar4 = realloc(__ptr,__ptr[1] + param_4 + 2)   //possible issue identified - semgrep
      *piVar7 = (int)pvVar4;
      memcpy((void *)((int)pvVar4 + *(byte *)((int)pvVar4 + 1) + 2),param_3,param_4)   //possible issue identified - semgrep
      *(char *)(*piVar7 + 1) = (char)param_4 + *(char *)(*piVar7 + 1);
      return;
    }
  }
LAB_00408910:
  puVar2 = (undefined4 *)malloc(8)   //possible issue identified - semgrep
  puVar3 = (undefined1 *)malloc(param_4 + 2)   //possible issue identified - semgrep
  *puVar3 = *(undefined1 *)(param_2 + 0x15);
  *puVar2 = puVar3;
  puVar3[1] = (char)param_4;
  memcpy(puVar3 + 2,param_3,param_4)   //possible issue identified - semgrep
  puVar6 = (undefined4 *)*param_1;
  if ((puVar6 == (undefined4 *)0x0) || (*(byte *)(param_2 + 0x15) <= *(byte *)*puVar6)) {
    puVar2[1] = puVar6;
    *param_1 = puVar2;
  }
  else {
    do {
      puVar5 = puVar6 + 1;
      puVar6 = (undefined4 *)puVar6[1];
      if (puVar6 == (undefined4 *)0x0) break;
    } while (*(byte *)*puVar6 < *(byte *)(param_2 + 0x15));
    puVar2[1] = puVar6;
    *puVar5 = puVar2;
  }
  return;
}