我正在编写一个覆盖某些系统调用的共享库。其中包括read(int fd, void *buf, size_t count)
系统调用。当然,这个库位于用户空间中。
所以,在我的库中,我正在从应用程序(使用read()
预加载我的lib)中捕获LD_PRELOAD
调用,执行一些操作,并在某些时候写入数据到应用程序缓冲区(void *buf
)。
有没有办法检查整个应用程序缓冲区是否可写?
大多数情况下这不是问题,但是我遇到了写得太差的应用程序,他们会在read()
调用中发布只读缓冲区,导致我的代码出现段错误正在以缓冲区作为目的地执行memcpy()
,这当然是有道理的。
注1:我目前正在研究内核如何在sys_read()
中的实际fs/read_write.c
中处理这种情况,但这并不是一件容易理解的事。
注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");
}
}
}