将文件映射到内存后出现分段错误
Segmentation fault after mapping a file to memory
我正在尝试 "mmap" 一个二进制文件,以便使用 AES 对其进行加密,然后使用以下代码将加密数据写入另一个文件 (outFile)。我试图修改函数 mmap() 和 open() 的标志,但是当我 运行 可执行文件时我总是遇到分段错误。
int main (void)
{
FILE *outFile; //The output file (encrypted)
/* A 256 bit key */
unsigned char *key = (unsigned char *)"01234567890123456789012345678901";
/* A 128 bit IV */
unsigned char *iv = (unsigned char *)"01234567890123456";
int fd;
struct stat sb;
void * memblock;
fd = open("result0.jpg",O_RDONLY);
outFile=fopen("result0enc.jpg","wb");
fstat(fd, &sb);
printf("Size: %lu\n", sb.st_size);
unsigned char decryptedtext[sb.st_size];
int decryptedtext_len, ciphertext_len;
/* Initialise the library */
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(NULL);
memblock = mmap(NULL, sb.st_size,PROT_READ, MAP_SHARED, fd, 0);
if (memblock == MAP_FAILED) {
close(fd);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
ciphertext_len = encrypt((unsigned char *)memblock, sb.st_size,key,iv,ciphertext);
fwrite( ciphertext,1, sb.st_size,outFile);
if (munmap(memblock, sb.st_size) == -1) {
perror("Error un-mmapping the file");
/* Decide here whether to close(fd) and exit() or not. Depends... */
}
close(fd);
fclose(outFile);
EVP_cleanup();
ERR_free_strings();
return 0;
}
正如yano在评论中提到的,你的错误在这里:
memcpy(outFile, ciphertext, sb.st_size);
你试图 memcpy 到 FILE *
这是完全错误的。那根本不符合您的期望。您正在覆盖 outFile
指向的 FILE
结构的私有内部结构。
您应该改为在缓冲区上操作并使用 fwrite
写入文件。
我建议您在深入研究 mmap
和加密之前使用 f...
函数熟悉基本文件 I/O 操作。
我正在尝试 "mmap" 一个二进制文件,以便使用 AES 对其进行加密,然后使用以下代码将加密数据写入另一个文件 (outFile)。我试图修改函数 mmap() 和 open() 的标志,但是当我 运行 可执行文件时我总是遇到分段错误。
int main (void)
{
FILE *outFile; //The output file (encrypted)
/* A 256 bit key */
unsigned char *key = (unsigned char *)"01234567890123456789012345678901";
/* A 128 bit IV */
unsigned char *iv = (unsigned char *)"01234567890123456";
int fd;
struct stat sb;
void * memblock;
fd = open("result0.jpg",O_RDONLY);
outFile=fopen("result0enc.jpg","wb");
fstat(fd, &sb);
printf("Size: %lu\n", sb.st_size);
unsigned char decryptedtext[sb.st_size];
int decryptedtext_len, ciphertext_len;
/* Initialise the library */
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(NULL);
memblock = mmap(NULL, sb.st_size,PROT_READ, MAP_SHARED, fd, 0);
if (memblock == MAP_FAILED) {
close(fd);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
ciphertext_len = encrypt((unsigned char *)memblock, sb.st_size,key,iv,ciphertext);
fwrite( ciphertext,1, sb.st_size,outFile);
if (munmap(memblock, sb.st_size) == -1) {
perror("Error un-mmapping the file");
/* Decide here whether to close(fd) and exit() or not. Depends... */
}
close(fd);
fclose(outFile);
EVP_cleanup();
ERR_free_strings();
return 0;
}
正如yano在评论中提到的,你的错误在这里:
memcpy(outFile, ciphertext, sb.st_size);
你试图 memcpy 到 FILE *
这是完全错误的。那根本不符合您的期望。您正在覆盖 outFile
指向的 FILE
结构的私有内部结构。
您应该改为在缓冲区上操作并使用 fwrite
写入文件。
我建议您在深入研究 mmap
和加密之前使用 f...
函数熟悉基本文件 I/O 操作。