1. ホーム
  2. c

[解決済み] C - Linux Kernel - current_uid()の支援

2022-02-17 06:06:17

質問

私はある課題の一部を担当しているのですが、その修正に困っています。要件は、システムコールのオープンをインターセプトし、一般ユーザーのための新しいシステムオープンコールに置き換えることであり、システムログにユーザーIDとファイル名をプリントアウトします。それ以外の場合は、標準のシステムオープンコールを実行するだけです。以下は、私が持っているもののうち、私を悩ませている部分です。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>

unsigned long **sys_call_table;

asmlinkage long (*ref_sys_open)(const char *filename, int flags, umode_t mode);
asmlinkage long (*ref_sys_close)(unsigned int fd);

asmlinkage long new_sys_open(const char *filename, int flags, umode_t mode) {

    if (current_uid() >= 1000) {

    printk(KERN_INFO "User %d is opening file: %s\n", current_uid(), filename);

    } else {

    (*ref_sys_open)(filename, flags, mode);

    }

    return 0;
}

私が得ている問題は、current_uid() の戻り値が kuid_t 型の構造体であることです。さらに調べてみると、その構造体は次のようなものでした。

typedef struct {
  uid_t val;
} kuid_t;

int 1000 と uid_t val 型を比較するにはどうすればよいのでしょうか?

余談ですが、旧バージョンのシステムコールは正しく呼び出せましたでしょうか?

解決方法は?

から ここで , uid_t の単なる型定義です。 __kernel_uid32_t であり、これは unsigned int によると こちら