1

我正在学习如何使用 lseek 在文件中创建漏洞。

这是我到目前为止写的代码......

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
    int fd;
    char name[20] = "Harry Potter";

    // Creating a file
    if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD ) < 0 )) {
        printf("\ncreat error");    
    }

    // Seeking 100th byte, from the begining of the file
    if ( lseek(fd, 100, SEEK_SET) == -1 ) {
        if (errno != 0) {
            perror("lseek");
        } 
    }

    // Writing to the 100th byte, thereby creating a hole
    if( write(fd, name, sizeof(char)*strlen(name)) != sizeof(char)*strlen(name) ) {
        if (errno != 0) {
            perror("write");
        }
    }

    // closing the file
    if ( close(fd) == -1 ) {
        if (errno != 0)
            perror("close"); 
    }

    return 0;
}

当我编译并执行此代码时,我收到一个 lseek 错误,并且名称“Harry Potter”也没有被插入到文件中。这是我执行上述代码时的输出:

lseek: Illegal seek
Harry Potter

我什至试图捕捉所有错误。请进一步帮助我。

4

1 回答 1

3
if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD ) < 0 )) {

如果打开成功,这会将 fd 设置为 0,如果打开失败,则设置为 1。因为您将它设置为 0,也就是您的控制台,所以它是写“哈利波特”的地方,而不是磁盘。而且你不能在终端上寻找。你要

if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD )) < 0 ) {

a) 系统调用失败后无需检查 errno != 0 。

b)您应该在错误时退出而不是失败。

c) sizeof(char) 始终为 1,因此无需乘以它。

d) main 应该有一个原型,例如,int main(void)

于 2014-08-14T11:17:06.457 回答