Unix套接字sendmsg消息返回權(quán)限錯(cuò)誤
Author:onceday date:2023年8月16日
解決linux設(shè)備上unix套接字sendmsg的一種錯(cuò)誤情景。
1. 問題
unix套接字有一種udp類傳輸,即數(shù)據(jù)報(bào)服務(wù)。這個(gè)套接字可以設(shè)置對(duì)端,也可以不設(shè)置對(duì)端。如下:
-
socket()
,創(chuàng)建套接字,這是所有套接字操作的基礎(chǔ)。 -
bind()
,對(duì)于unix套接字,這會(huì)綁定一個(gè)字符串地址。 -
connect()
,對(duì)于unix數(shù)據(jù)報(bào)套接字,也可以綁定對(duì)端。
一般對(duì)于數(shù)據(jù)報(bào)類的套接字,只需要前兩步就行了, 因?yàn)閿?shù)據(jù)報(bào)是無狀態(tài)連接,各報(bào)文之間獨(dú)立,沒有額外的狀態(tài)維護(hù)過程。
如果此時(shí)我們用sendmsg發(fā)送一個(gè)消息,但返回權(quán)限不允許錯(cuò)誤(1),而且收到的消息是正確的,即對(duì)端可以給本套接字發(fā)送消息,但我們沒辦法回復(fù)消息,那么有很大可能是對(duì)端套接字進(jìn)行了connect操作。
下面是af_unix.c
源碼中unix_dgram_sendmsg
函數(shù)中的部分代碼,即sendmsg函數(shù)底層實(shí)際調(diào)用函數(shù):
err = -EPERM;
if (!unix_may_send(sk, other))
goto out_unlock;
這里有一個(gè)判斷,如果不滿足,直接退出,很明顯,返回權(quán)限錯(cuò)誤和這個(gè)判斷有關(guān)系。
static inline int unix_our_peer(struct sock *sk, struct sock *osk)
{
return unix_peer(osk) == sk;
}
static inline int unix_may_send(struct sock *sk, struct sock *osk)
{
return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
}
如上,從這個(gè)函數(shù)可以看出,其判斷發(fā)送的目的套接字是否具有對(duì)端,以及目的套接字的對(duì)端是否是本端套接字。只有目的套接字無對(duì)端地址(無connect
操作)或者connect
對(duì)象為本端才能驗(yàn)證通過,否則返回權(quán)限錯(cuò)誤。文章來源:http://www.zghlxwxcb.cn/news/detail-664681.html
2. 結(jié)論
以上分析表明,如果unix數(shù)據(jù)報(bào)套接字要實(shí)現(xiàn)多對(duì)多自由發(fā)送,就必須放棄connect操作,否則發(fā)送時(shí)會(huì)遇到EPERM
錯(cuò)誤。文章來源地址http://www.zghlxwxcb.cn/news/detail-664681.html
到了這里,關(guān)于(5)unix套接字sendmsg消息返回權(quán)限錯(cuò)誤(EPERM)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!