shmat は selinux が有効な rhel 環境でエラー (void *) -1 を返します。

shmat は selinux が有効な rhel 環境でエラー (void *) -1 を返します。

文書によると: -

shmflgにSHM_RDONLYを指定した場合、セグメントは読み取り用に接続され、プロセスにはセグメントに対する読み取り権限が必要です。そうでない場合、セグメントは読み取りおよび書き込み用に接続され、プロセスにはセグメントに対する読み取りおよび書き込み権限が必要です。書き込み専用共有メモリセグメントという概念はありません。

したがって、ここでは、上記の文に従って共有メモリへの読み書きアクセスを提供するゼロを渡します。

ipcs出力:-

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

0x5304f6ab 98307      root       666        64         1

メモリに添付されたC ++コード

    //Get shared memory for given shm_id
    uint8_t* mem = (uint8_t *) shmat(_shm_id, NULL, 0);
    
    if ((void *) mem == (void *) -1){
       // in selinux enable system I am keep on coming here, mem is alway 0XFFFFFFF..
        return -1;
    }

奇妙なことは、shmat関数にSHM_RDONLYフラグを渡すと、共有メモリへのアクセス権を読み書きできるにもかかわらず、正しい共有メモリ位置を取得することです。

ここで唯一の違いは、メモリがルートによって作成され、他のユーザー(user1など)によって読み取られることです。しかし、666権限が与えられたので、これが問題になる可能性があるとは思わず、selinuxがここでいくつかの問題を引き起こしているかどうかはわかりません。

ベストアンサー1

おすすめ記事