Переполнение на основе кучи - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу службу загрузки файлов с использованием удаленного вызова процедуры (gRP C) в C ++. Клиент разбивает файл на порции и отправляет порции через поток gRP C. Сервер считывает поток gRP C и записывает в файл. При чтении потока gRP C происходит переполнение кучи. Я решил это с помощью strcpy, но использование strcpy загрязняет мой файл. Как решить проблему переполнения кучи

Протообъект

    message FileContent {
  bytes content = 1;
  int32 counter = 2;
}

Client Writer

char buffer[4096];
 while(file_offset < filelength)
 {
    memset(buffer,0,4096);
    bytes_read = pread(filedes, buffer, 4096,file_offset);
    filecontent.set_content(std::string(buffer, bytes_read));
    filecontent.set_counter(bytes_read);
    writer->Write(filecontent);
    file_offset+=bytes_read;
  }

Server Reader

char buffer[4096];
  while (reader->Read(&filecontent))
   {
     bytes_read=filecontent.counter();
     cout << "Bytes Read" << bytes_read << endl;
     strcpy(buffer,filecontent.mutable_content()->c_str());  // if I don't do this, I get heap based overflow when the next line executes. But this corrupts my file. How do I fix it?
     write(filedes, buffer,(bytes_read));
     file_offset+=bytes_read;
   }

Я читаю данные файла из непрерывного потока. Файл разбивается на куски и отправляется в потоке gRP C. Каждый блок требует условия на стороне сервера с помощью операции strcpy для предотвращения переполнения на основе кучи, но если я это сделаю, я повреждаю байты файла. Как мне прочитать из потока и записать в файл без добавления нулевого терминатора. ПОЖАЛУЙСТА, ПОМОГИТЕ !!!

1 Ответ

1 голос
/ 15 апреля 2020

Ваш элемент GRP c filecontent должен иметь функцию copy(). Вместо использования strcpy вы можете скопировать содержимое файла с помощью этой функции:

filecontent.content().copy(buffer,bytes_read)

...