Linux — C ++ Libzip + удалить = дамп ядра

У меня есть проблема при использовании libzip. Я нахожусь на Linux и установил библиотеку с помощью sudo apt-get install libzip2 libzip-dev (так что, это не Последняя версия).

Вот мой код:

#include <iostream>
#include <zip.h>
#include <unistd.h>
#include <sys/stat.h>

#define ZIP_ERROR 2

using namespace std;

bool isFilePresent(string const& path)
{
struct stat *buf;
return(stat(path.c_str(), buf)==0);
}

int main(void)
{
struct zip *zip;
struct zip_source *zip_source;
int err(0);
string zipFile("filesZip/zipTest");
string fileToZip("filesToZip/test1");
string fileToZip2("filesToZip/test2");
char tmp[] = "filesZip/zipTest\0";

// Test if the file is present
if(isFilePresent(zipFile))
{
// if(remove(tmp) != 0)
if(remove(zipFile.c_str()) != 0)
{
return ZIP_ERROR;
}
}
// Open a zip archive
zip = zip_open(zipFile.c_str(), ZIP_CREATE, &err);

// if there is an error on the opening
if(err != ZIP_ER_OK)
{
cout << "error when opening" << endl;
return ZIP_ERROR;
}

// If the zip file is not open
if(zip == NULL)
{
zip_close(zip);
cout << "error when zip opens" << endl;
return ZIP_ERROR;
}

// zip_source_file zip a file so that it can be added to the zip
if((zip_source = zip_source_file(zip, fileToZip.c_str(), (off_t)0, (off_t)0))== NULL)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when zipping file1" << endl;
return ZIP_ERROR;
}

// Add the zipped file to the zip
if(zip_add(zip, fileToZip.c_str(), zip_source)==-1)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when adding file1" << endl;
return ZIP_ERROR;
}

// zip_source_file zip a file so that it can be added to the zip
if((zip_source = zip_source_file(zip, fileToZip2.c_str(), (off_t)0, (off_t)0))== NULL)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when zipping file2" << endl;
return ZIP_ERROR;
}

if(zip_add(zip, fileToZip2.c_str(), zip_source)==-1)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when adding file2" << endl;
return ZIP_ERROR;
}

// sleep(180);

// Closing the archive
zip_close(zip);

return 0;
}

Этот код должен взять два файла в папке filesToZip и сжать их в файл zipTest в папке filesZip.

Для этого сначала проверяется, существует ли файл zipTest. Если это так, то он удаляет его. А затем он открывает zip-архив, архивирует файлы для добавления и добавляет их в архив перед закрытием архива.

Итак, моя проблема:

когда файлы zip архива zip / zipTest не существуют, тогда он работает просто отлично.
когда файлы zip архива zip / zipTest существуют, то я получаю дамп памяти.

Что я пробовал до сих пор:

  • Я думал, что это потому, что я использовал строки для имен файлов. Я попробовал с char и ничего не изменилось
  • затем я подумал, что это потому, что задача удаления не была завершена, и тогда может возникнуть конфликт. Поэтому я ставлю sleep (180) (в секундах) после каждого вызова функции. Это ничего не изменило
  • Я также пытался поместить в архив только один файл. Ничего не менял
  • Я запустил GDB, чтобы увидеть, что происходит. Я пробовал оба, когда zip-архив уже существует и не сделал.
    • если архив еще не существует: все прошло гладко до возврата 0, а затем я увидел, что программа переопределила fileToZip и fileToZip2, затем сделал еще один возврат 0, затем остановился бы.
    • если архив уже существует: он делает то же самое, но затем говорит, что не может найти границы текущей функции. (я прочитал Вот что это означает, что GDB не имеет отладочной информации и недоволен этим ..)

У кого-нибудь есть идеи, в чем может быть моя проблема?

3

Решение

Это опасно

bool isFilePresent(string const& path)
{
struct stat *buf;
return(stat(path.c_str(), buf)==0);
}

Вы не выделяете память для своего struct stat* так что случайная память записывается при вызове функции, что может привести к сбою.

Попробуй это:

bool isFilePresent(string const& path)
{
struct stat buf; // memory is allocated on the stack for this object
return(stat(path.c_str(), &buf)==0); // pass its address to the function
}

Это создает местный struct stat объект и передает свой адрес функции.

4

Другие решения


По вопросам рекламы [email protected]