0

一部のシステムコールをオーバーライドする共有ライブラリを作成しています。その中にはread(int fd, void *buf, size_t count)syscallがあります。もちろん、このライブラリはユーザー空間にあります。

そのため、私のライブラリではread()、アプリケーションからの呼び出し (ライブラリのLD_PRELOADプリロードに使用) をキャッチし、さまざまなことを実行し、ある時点でアプリケーション バッファにデータを書き込みます ( void *buf)。

アプリケーション バッファ全体が書き込み可能かどうかを確認する方法はありますか?

ほとんどの場合、それは問題ではありませんが、read()呼び出しで読み取り専用memcpy()バッファーを投稿するほど不十分に作成されたアプリケーションに出くわしました。もちろん、これは理にかなっています。

sys_read()注1:現在、カーネルが実際にその状況をどのように処理しているかを調べていますが、fs/read_write.c理解するのはそれほど簡単ではありません.

注 2: このソリューションでは、オーバーヘッドをできるだけ少なくする必要があります。

4

2 に答える 2

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) ...
于 2012-12-05T19:28:00.163 に答える
0

これは @R の微調整です。パフォーマンスへの影響を軽減するための応答。

/dev/zero を開閉し続ける必要はありません。一度開いて、開いたままにします。次に、読み取りを試みるたびに、1 バイトだけを読み取って、バッファーが書き込み可能かどうかを調べます。

#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");
        }
    }
}
于 2012-12-06T22:01:32.977 に答える