fixup: check for NULL pointers
[metze/samba/wip.git] / source3 / lib / msghdr.c
index 9d5f28bbb3a7c85062b31a26f130c37d1692c2ea..82f7ca7cdee18e2be7cfac0f13dd9ea989476f2a 100644 (file)
@@ -40,7 +40,7 @@ ssize_t msghdr_prep_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
        if (num_fds > INT8_MAX) {
                return -1;
        }
-       if (cmsg_space > bufsize) {
+       if ((msg == NULL) || (cmsg_space > bufsize)) {
                return cmsg_space;
        }
 
@@ -125,3 +125,51 @@ struct msghdr *msghdr_buf_msghdr(struct msghdr_buf *msg)
 {
        return &msg->msg;
 }
+
+size_t msghdr_prep_recv_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
+                           size_t num_fds)
+{
+       size_t ret = CMSG_SPACE(sizeof(int) * num_fds);
+
+       if (bufsize < ret) {
+               return ret;
+       }
+       if (msg != NULL) {
+               if (num_fds != 0) {
+                       msg->msg_control = buf;
+                       msg->msg_controllen = ret;
+               } else {
+                       msg->msg_control = NULL;
+                       msg->msg_controllen = 0;
+               }
+       }
+       return ret;
+}
+
+size_t msghdr_extract_fds(struct msghdr *msg, int *fds, size_t fds_size)
+{
+       struct cmsghdr *cmsg;
+       size_t num_fds;
+
+       for(cmsg = CMSG_FIRSTHDR(msg);
+           cmsg != NULL;
+           cmsg = CMSG_NXTHDR(msg, cmsg))
+       {
+               if ((cmsg->cmsg_type == SCM_RIGHTS) &&
+                   (cmsg->cmsg_level == SOL_SOCKET)) {
+                       break;
+               }
+       }
+
+       if (cmsg == NULL) {
+               return 0;
+       }
+
+       num_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
+
+       if ((num_fds != 0) && (fds != NULL) && (fds_size >= num_fds)) {
+               memcpy(fds, CMSG_DATA(cmsg), num_fds * sizeof(int));
+       }
+
+       return num_fds;
+}