如何检查缓冲区是否可写?

时间:2012-12-05 18:57:55

标签: c buffer system-calls

我正在编写一个覆盖某些系统调用的共享库。其中包括read(int fd, void *buf, size_t count)系统调用。当然,这个库位于用户空间中。

所以,在我的库中,我正在从应用程序(使用read()预加载我的lib)中捕获LD_PRELOAD调用,执行一些操作,并在某些时候写入数据到应用程序缓冲区(void *buf)。

有没有办法检查整个应用程序缓冲区是否可写?

大多数情况下这不是问题,但是我遇到了写得太差的应用程序,他们会在read()调用中发布只读缓冲区,导致我的代码出现段错误正在以缓冲区作为目的地执行memcpy(),这当然是有道理的。

注1:我目前正在研究内核如何在sys_read()中的实际fs/read_write.c中处理这种情况,但这并不是一件容易理解的事。

注2:解决方案应尽可能少地增加开销。

2 个答案:

答案 0 :(得分:1)

试试这个:

int fd = open("/dev/zero", O_RDONLY);
ssize_t ret = read(fd, dest, amt_to_write);
int err = errno;
close(fd);
if (ret<0 && err==EFAULT) ...

答案 1 :(得分:0)

这是@R的调整。响应以减轻性能损失。

没有必要保持打开和关闭/ dev / zero。打开它吧 一旦打开它。然后,每次你试图做 读取,只读取一个字节以确定缓冲区是否可写。

#include <sys/types.h>
#include <sys/fcntl.h>
#include <unistd.h>   

int                
check_writable(char *buf)
{                         
    static int fd;
    int r;

    if (fd == 0) {
            fd = open("/dev/zero", O_RDONLY);
    }

    r = read(fd, buf, 1);

    if (r != 1) {
            return(0);
    }

    return(1);
}             


int
main()
{  
    char *s, wr[8], *rd = "read-only buf";
    int j, r;

    for (j = 0; j < 2; j++) {
        if (j == 0) {
            s = rd;
        }
        else {
            s = wr;
        }

        r = check_writable(s);
        if (r == 0) {
            printf("read-only buffer\n");
        }
        else {
            printf("writable buffer\n");
        }
    }
}