免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2795 | 回复: 0
打印 上一主题 下一主题

linux 用户凭证传递问题 (struct ucred) !很奇怪! [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-18 01:13 |只看该作者 |倒序浏览
都用root用户测试
这是client发送凭证代码:

#define CONTROL_LEN  (sizeof(struct cmsghdr) + sizeof(struct ucred))
ssize_t write_cred(int fd, void *ptr, size_t nbytes){
52
53
54             struct ucred            *credp = NULL;
55             struct msghdr           msg;
56             struct iovec            iov[1];
57             struct cmsghdr          *cmptr = NULL;
58             int                     n;
59
60
61
62             if ((cmptr = malloc(CONTROL_LEN)) == NULL)
63                 return (-1);
64
65             msg.msg_name        = NULL;
66             msg.msg_namelen     = 0;
67             iov[0].iov_base     = ptr;
68             iov[0].iov_len      = nbytes;
69             msg.msg_iov         = iov;
70             msg.msg_iovlen      = 1;
71             msg.msg_control     = cmptr;
72             msg.msg_controllen  = CONTROL_LEN;
73             msg.msg_flags       = 0;
74
75             cmptr->cmsg_level = SOL_SOCKET;
76             cmptr->cmsg_type  = SCM_CREDENTIALS;
77             cmptr->cmsg_len   = CMSG_LEN(sizeof(struct ucred));
78
79             credp = (struct ucred *)CMSG_DATA(cmptr);
80
81             credp->uid = geteuid();
82             credp->gid = getegid();
83             credp->pid = getpid();
84
85
86             n = sendmsg(fd, &msg, 0); // gdb 调试到这里一切正常 msg的各个部分都被设置了
87
88             return n;
89 }

这是server的接收凭证的代码:

ssize_t read_cred(int fd, void *ptr, size_t nbytes, struct ucred *ucredptr){
102
103      struct msghdr          msg;
104      struct iovec            iov[1];
105      struct cmsghdr       *cmptr;
106      char                   control[CONTROL_LEN];
107      int                    n;
108
109      msg.msg_name = NULL;
110      msg.msg_namelen = 0;
111      iov[0].iov_base = ptr;
112      iov[0].iov_len  = nbytes;
113      msg.msg_iov = iov;
114      msg.msg_iovlen = 1;
115      msg.msg_control = control;
116      msg.msg_controllen = CONTROL_LEN;
117      msg.msg_flags = 0;
118
119      if ((n = recvmsg(fd, &msg, 0)) < 0)      //在这里返回时n是正确的 但msg_controllen 被设置为0!疑问???????
120         return n;
121
122
123      if (ucredptr != NULL && msg.msg_controllen > 0){
124             cmptr = (struct cmsghdr *)control;
125
126             if (cmptr->cmsg_len < CONTROL_LEN)
127                 err_quit("control length = %d", cmptr->cmsg_len);
128
129             if (cmptr->cmsg_level != SOL_SOCKET)
130                 err_quit("control level != SOL_SOCKET");
131
132             if (cmptr->cmsg_type != SCM_CREDENTIALS);
133                 err_quit("control type != SCM_CREDENTIALS");
134              //ucredptr = (struct ucred *)CMSG_DATA(cmptr);
135
136             memcpy(ucredptr, CMSG_DATA(cmptr), sizeof(struct ucred));
137     }
138
139     return n;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP