Core panic' ed ESP32

Hello. I wrote this code, and I get a kernel error. This is most likely due to a buffer overflow, but I don't know how to fix it. Help me please.

#include <WiFi.h>
#include <PubSubClient.h>
#include <ezButton.h>
#include "FS.h"
#include <SPIFFS.h>
#include <ArduinoJson.h>
#include <GyverPortal.h>

////////////////////////////////////////////////
//WiFi_MQTT
struct config_wifi_struct {
  char* ssid;
  char* pass;
  bool DHCP;
  char* ip;
  char* gt;
  char* mac;
  char* dns;
};

struct config_mqtt_struct {
  char* mqtt_server;
  int mqtt_port;
  char* mqtt_username;
  char* mqtt_password;
};

config_wifi_struct str_wifi;
config_mqtt_struct str_mqtt;

WiFiClient   wifiClient;
PubSubClient MQTTclient(wifiClient);

SemaphoreHandle_t sema_MQTT_KeepAlive;

/// button_relay
const int BUTTON_PIN_1 = 27;
const int BUTTON_PIN_2 = 26;
const int LED_PIN_1 = 4;
const int LED_PIN_2 = 2;

ezButton button_1(BUTTON_PIN_1);
ezButton button_2(BUTTON_PIN_2);

int ledState_1 = LOW;
int ledState_2 = LOW;

/// json
#define FORMAT_SPIFFS_IF_FAILED true

////////////////////////////////////////////
void setup()
{
  Serial.begin(115200);

  Serial.println("Start");

  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_PIN_2, OUTPUT);
  
  button_1.setDebounceTime(50);
  button_2.setDebounceTime(50);
  
  if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
        Serial.println("SPIFFS Mount Failed");
        return;
  }

  Serial.println(read_config_wifi_mqtt(readFile(SPIFFS, "/config_wifi_mqtt.json")));

  if(button_1.isPressed()) {
    loginPortal();
  }
  
  sema_MQTT_KeepAlive = xSemaphoreCreateBinary();
  xSemaphoreGive(sema_MQTT_KeepAlive);
  xTaskCreatePinnedToCore(MQTTkeepalive, "MQTTkeepalive", 20000, NULL, 3, NULL, 1);
}

void loop() {
  button_1.loop();
  button_2.loop();

  if(button_1.isPressed()) {
    ledState_1 = !ledState_1;
    digitalWrite(LED_PIN_1, ledState_1);
    char val[5];
    itoa(ledState_1, val, 10);
    MQTTclient.publish("esp32/led1_st", val);
  }
  if(button_2.isPressed()) {
    ledState_2 = !ledState_2;
    digitalWrite(LED_PIN_2, ledState_2);
    char val[5]; 
    itoa(ledState_2, val, 10);
    MQTTclient.publish("esp32/led2_st", val);
  }
}

///////////_____MQTT_WIFI_SETTINGS
void MQTTkeepalive( void *pvParameters )
{
  MQTTclient.setKeepAlive( 90 );
  for (;;)
  {
    if ((wifiClient.connected()) && (WiFi.status() == WL_CONNECTED))
    {
      xSemaphoreTake(sema_MQTT_KeepAlive, portMAX_DELAY);
      MQTTclient.loop();
      xSemaphoreGive( sema_MQTT_KeepAlive );
    }
    else {
      Serial.print("MQTT keep alive found MQTT status: ");
      Serial.println(String(wifiClient.connected()));
      Serial.print("WiFi status: ");
      Serial.println(String(WiFi.status()));
      if (!(WiFi.status() == WL_CONNECTED))
      {
        connectToWiFi();
      }
      connectToMQTT();
    }
    vTaskDelay( 250 );
  }
  vTaskDelete ( NULL );
}

void connectToMQTT()
{
  String client_id = "esp32-client-";
  client_id += String(WiFi.macAddress());
  Serial.print("Connect to MQTT as client: ");

  Serial.println(client_id);
  MQTTclient.setServer(str_mqtt.mqtt_server, str_mqtt.mqtt_port);

  MQTTclient.setCallback(callback);
  while (!MQTTclient.connected())
  {
    MQTTclient.connect(client_id.c_str(), str_mqtt.mqtt_username, str_mqtt.mqtt_password);
    Serial.println("Connecting to MQTT");
    vTaskDelay(250);
  }
  Serial.println("MQTT Connected");
}

void connectToWiFi()
{
  Serial.println("Connect to WiFi");
  while ( WiFi.status() != WL_CONNECTED )
  {
    WiFi.disconnect();
    WiFi.begin( str_wifi.ssid, str_wifi.pass );
    ("waiting on wifi connection");
    vTaskDelay( 4000 );
  }
  Serial.println("Connected to WiFi");
  Serial.print("mac address: ");
  Serial.println(WiFi.macAddress());
  WiFi.onEvent(WiFiEvent);
}

void WiFiEvent(WiFiEvent_t event)
{
  switch (event) {
    case SYSTEM_EVENT_STA_CONNECTED:
      Serial.println("Connected to access point");
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("Disconnected from WiFi access point");
      break;
    case SYSTEM_EVENT_AP_STADISCONNECTED:
      Serial.println("WiFi client disconnected");
      break;
    default: break;
  }
}

void callback(char* topic, byte* message, unsigned int length) {
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    messageTemp += (char)message[i];
  }

  Serial.println(messageTemp);
}

///////////_____WEB_Portal
void build_login() {
  BUILD_BEGIN();
  GP.THEME(GP_DARK);
  
  GP.FORM_BEGIN("/login");
  GP.TEXT("lg", "Login", str_wifi.ssid);
  GP.BREAK();
  GP.TEXT("ps", "Password", str_wifi.pass);
  GP.BREAK();
  GP.LABEL("DHCP: ");
  GP.BREAK();
  GP.CHECK("DHCP", str_wifi.DHCP);
  GP.BREAK();
  GP.TEXT("ip", "ip", str_wifi.ip);
  GP.BREAK();
  GP.TEXT("gt", "gt", str_wifi.gt);
  GP.BREAK();
  GP.TEXT("mac", "mac", str_wifi.mac);
  GP.BREAK();
  GP.TEXT("dns", "dns", str_wifi.dns);
  GP.BREAK();
  GP.TEXT("mqtt_server", "mqtt_server", str_mqtt.mqtt_server);
  GP.BREAK();
  GP.NUMBER("mqtt_port", "mqtt_port", str_mqtt.mqtt_port);
  GP.BREAK();
  GP.TEXT("mqtt_username", "mqtt_username", str_mqtt.mqtt_username);
  GP.BREAK();
  GP.TEXT("mqtt_password", "mqtt_password", str_mqtt.mqtt_password);
  GP.BREAK();
  GP.SUBMIT("Submit");
  GP.FORM_END();

  BUILD_END();
}

void action_login(GyverPortal& p) {
  if (p.form("/login")) {
    p.copyStr("lg", str_wifi.ssid);
    p.copyStr("ps", str_wifi.pass);
    str_wifi.DHCP = p.getCheck("DHCP");
    p.copyStr("ip", str_wifi.ip);
    p.copyStr("gt", str_wifi.gt);
    p.copyStr("mac", str_wifi.mac);
    p.copyStr("dns", str_wifi.dns);
    p.copyStr("mqtt_server", str_mqtt.mqtt_server);
    str_mqtt.mqtt_port = p.getInt("mqtt_port");
    p.copyStr("mqtt_username", str_mqtt.mqtt_username);
    p.copyStr("mqtt_password", str_mqtt.mqtt_password);
    
    WiFi.softAPdisconnect();
    load_config_wifi_mqtt();
    
  }
}

void loginPortal() {
  Serial.println("Portal start");

  // запускаем точку доступа
  WiFi.mode(WIFI_AP);
  WiFi.softAP("WiFi Config");

  // запускаем портал
  Serial.println("Запуск портала");
  GyverPortal portal;
  portal.attachBuild(build_login);
  Serial.println("Запуск build_login");
  portal.start(WIFI_AP);
  Serial.println("Запуск WIFI_AP");
  portal.attach(action_login);
  Serial.println("Запуск action_login");

  // работа портала
  while (portal.tick());
}

///////////_____SPIFFS
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\r\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("- failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println(" - not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("\tSIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

String readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\r\n", path);
    String return_err = "error";
    File file = fs.open(path);
    if(!file || file.isDirectory()){
        Serial.println("- failed to open file for reading");
        return return_err;
    }
    
    String msg_string;
    while(file.available()){
        msg_string += char(file.read());
    }
    file.close();
    return msg_string;
}

void writeFile(fs::FS &fs, const char * path, String message){
    Serial.printf("Writing file: %s\r\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("- failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("- message appended");
    } else {
        Serial.println("- append failed");
    }
    file.close();
}

///////////_____JSON_load_read
bool read_config_wifi_mqtt(String msg_json_wifi_mqtt_config){

  StaticJsonDocument<300> doc;
  DeserializationError error = deserializeJson(doc, msg_json_wifi_mqtt_config);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return false;
  }

  strcpy(str_wifi.ssid, doc["ssid"]);
  strcpy(str_wifi.pass, doc["pass"]);
  //str_wifi.DHCP = doc["DHCP"];
  strcpy(str_wifi.gt, doc["gt"]);
  strcpy(str_wifi.mac, doc["mac"]);
  strcpy(str_wifi.dns, doc["dns"]);
  strcpy(str_wifi.ip, doc["ip"]);
  strcpy(str_mqtt.mqtt_server, doc["mqtt_server"]);
  //str_mqtt.mqtt_port = doc["mqtt_port"];
  strcpy(str_mqtt.mqtt_username, doc["mqtt_username"]);
  strcpy(str_mqtt.mqtt_password, doc["mqtt_password"]);
  
  Serial.println(str_wifi.ssid);
  Serial.println(str_wifi.pass);
  Serial.println(str_wifi.DHCP);
  Serial.println(str_wifi.ip);
  Serial.println(str_wifi.gt);
  Serial.println(str_wifi.mac);
  Serial.println(str_wifi.dns);
  Serial.println(str_mqtt.mqtt_server);
  Serial.println(str_mqtt.mqtt_port);
  Serial.println(str_mqtt.mqtt_username);
  Serial.println(str_mqtt.mqtt_password);
  
  return true;
}

bool load_config_wifi_mqtt(){

  StaticJsonDocument<300> doc;
  
  doc["ssid"] = str_wifi.ssid;
  doc["pass"] = str_wifi.pass;
  doc["DHCP"] = str_wifi.DHCP;
  doc["ip"] = str_wifi.ip;
  doc["gt"] = str_wifi.gt;
  doc["mac"] = str_wifi.mac;
  doc["dns"] = str_wifi.dns;
  doc["mqtt_server"] = str_mqtt.mqtt_server;
  doc["mqtt_port"] = str_mqtt.mqtt_port;
  doc["mqtt_username"] = str_mqtt.mqtt_username;
  doc["mqtt_password"] = str_mqtt.mqtt_password;
  
  String msg_return;
  serializeJson(doc, msg_return);
  Serial.print(msg_return);
  writeFile(SPIFFS, "/config_wifi_mqtt.json", msg_return);
  
  return true;
}

ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5856
entry 0x400806a8
Start
Reading file: /config_wifi_mqtt.json
Guru Meditation Error: Core  1 panic'ed (StoreProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400013d2  PS      : 0x00060330  A0      : 0x800d284c  A1      : 0x3ffb1d50  
A2      : 0x00000000  A3      : 0x3ffb1e1e  A4      : 0x000000ff  A5      : 0x0000ff00  
A6      : 0x00ff0000  A7      : 0xff000000  A8      : 0x00000031  A9      : 0x3ffb1d20  
A10     : 0x00000000  A11     : 0x3f40064c  A12     : 0x00000001  A13     : 0x0000000a  
A14     : 0x00000000  A15     : 0x3ffb1e47  SAR     : 0x00000010  EXCCAUSE: 0x0000001d  
EXCVADDR: 0x00000000  LBEG    : 0x400012e5  LEND    : 0x40001309  LCOUNT  : 0x800d0e33  

ELF file SHA256: 0000000000000000

Backtrace: 0x400013d2:0x3ffb1d50 0x400d2849:0x3ffb1d60 0x400d3c4a:0x3ffb1f70 0x400dd66e:0x3ffb1fb0 0x400899ce:0x3ffb1fd0
PC: 0x400013d2
EXCVADDR: 0x00000000

Decoding stack results
0x400d2849: read_config_wifi_mqtt(String) at D:\User\Рабочий стол\primer\2_core/2_core.ino line 359
0x400d3c4a: setup() at D:\User\Рабочий стол\primer\2_core/2_core.ino line 69
0x400dd66e: loopTask(void*) at D:\���������\ArduinoData\packages\esp32\hardware\esp32\1.0.6\cores\esp32\main.cpp line 18
0x400899ce: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143

See Esp 32 Core 1 panic'ed - #19 by skipinkd