this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Code fixes in recvmsg

+25 -12
+25 -12
src/kernel/emulation/linux/network/recvmsg.c
··· 10 10 extern void free(void* ptr); 11 11 extern void* memcpy(void* dest, const void* src, __SIZE_TYPE__ len); 12 12 13 + #define ALIGN(what, how) ( ((what) + (how) - 1) & ~((how) - 1) ) 14 + 13 15 long sys_recvmsg(int socket, struct bsd_msghdr* msg, int flags) 14 16 { 15 17 return sys_recvmsg_nocancel(socket, msg, flags); ··· 36 38 // __simple_printf("controllen=%d\n", msg->msg_controllen); 37 39 lchdr = (struct linux_cmsghdr*) malloc(msg->msg_controllen + 4); 38 40 lmsg.msg_control = lchdr; 39 - lmsg.msg_controllen = msg->msg_controllen + 4; 41 + lmsg.msg_controllen = msg->msg_controllen + 4; // FIXME: there could be multiple control messages in a message 40 42 } 41 43 else 42 44 { ··· 68 70 { 69 71 if (sizeof(unsigned long) != 4) 70 72 { 71 - if (lmsg.msg_controllen > 0) 73 + int lpos = 0, bpos = 0; 74 + struct linux_cmsghdr* lnext; 75 + struct bsd_cmsghdr* bnext; 76 + 77 + msg->msg_controllen = lmsg.msg_controllen; 78 + 79 + // __simple_printf("Processing %d bytes of control data\n", msg->msg_controllen); 80 + while (lpos < lmsg.msg_controllen) 72 81 { 73 - bchdr->cmsg_len = lchdr->cmsg_len; 74 - bchdr->cmsg_level = socket_level_linux_to_bsd(lchdr->cmsg_level); 75 - bchdr->cmsg_type = lchdr->cmsg_type; 82 + lnext = (struct linux_cmsghdr*) (((char*) lmsg.msg_control) + lpos); 83 + bnext = (struct bsd_cmsghdr*) (((char*) msg->msg_control) + bpos); 84 + 85 + // __simple_printf("Linux msg at %d -> BSD at %d\n", lpos, bpos); 86 + 87 + bnext->cmsg_len = lnext->cmsg_len - (sizeof(struct linux_cmsghdr) - sizeof(struct bsd_cmsghdr)); 88 + bnext->cmsg_level = socket_level_linux_to_bsd(lnext->cmsg_level); 89 + bnext->cmsg_type = lnext->cmsg_type; 76 90 77 - // __simple_printf("Copy %p to %p, %d bytes (of %d)\n", lchdr->cmsg_data, bchdr->cmsg_data, lchdr->cmsg_len - sizeof(struct linux_cmsghdr), lchdr->cmsg_len); 78 - // __simple_printf("Hdr says controllen=%d\n", lmsg.msg_controllen); 91 + // __simple_printf("About to copy %d bytes\n", lnext->cmsg_len - sizeof(struct linux_cmsghdr)); 79 92 80 - memcpy(bchdr->cmsg_data, lchdr->cmsg_data, 81 - lchdr->cmsg_len - sizeof(struct linux_cmsghdr)); 82 - msg->msg_controllen = lmsg.msg_controllen - 4; 93 + memcpy(bnext->cmsg_data, lnext->cmsg_data, lnext->cmsg_len - sizeof(struct linux_cmsghdr)); 94 + msg->msg_controllen -= 4; 95 + 96 + lpos += ALIGN(lnext->cmsg_len, sizeof(unsigned long)); 97 + bpos += ALIGN(bnext->cmsg_len, 4); 83 98 } 84 - else 85 - msg->msg_controllen = 0; 86 99 } 87 100 else 88 101 {