mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
sock: fix some memory leaks and correctness in copyhdr
This commit is contained in:
@@ -195,47 +195,61 @@ static inline int sock_copymsghdr(msghdr_t *khdr, msghdr_t *uhdr) {
|
|||||||
if (usercopy_fromuser(khdr, uhdr, sizeof(msghdr_t)))
|
if (usercopy_fromuser(khdr, uhdr, sizeof(msghdr_t)))
|
||||||
return EFAULT;
|
return EFAULT;
|
||||||
|
|
||||||
iovec_t *iovectmp = alloc(sizeof(iovec_t) * khdr->iovcount);
|
iovec_t *iovectmp = NULL;
|
||||||
if (iovectmp == NULL)
|
if (khdr->iovcount) {
|
||||||
return ENOMEM;
|
iovectmp = alloc(sizeof(iovec_t) * khdr->iovcount);
|
||||||
|
if (iovectmp == NULL)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
if (usercopy_fromuser(iovectmp, khdr->iov, sizeof(iovec_t) * khdr->iovcount))
|
if (usercopy_fromuser(iovectmp, khdr->iov, sizeof(iovec_t) * khdr->iovcount)) {
|
||||||
return EFAULT;
|
free(iovectmp);
|
||||||
|
return EFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
khdr->iov = iovectmp;
|
khdr->iov = iovectmp;
|
||||||
|
|
||||||
if (khdr->addr) {
|
if (khdr->addr) {
|
||||||
abisockaddr_t *addrtmp = alloc(khdr->addrlen);
|
abisockaddr_t *addrtmp = alloc(khdr->addrlen);
|
||||||
if (addrtmp == NULL) {
|
if (addrtmp == NULL) {
|
||||||
free(iovectmp);
|
if (iovectmp);
|
||||||
|
free(iovectmp);
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usercopy_fromuser(addrtmp, khdr->addr, khdr->addrlen)) {
|
if (usercopy_fromuser(addrtmp, khdr->addr, khdr->addrlen)) {
|
||||||
free(iovectmp);
|
if (iovectmp)
|
||||||
|
free(iovectmp);
|
||||||
|
free(addrtmp);
|
||||||
return EFAULT;
|
return EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
khdr->addr = addrtmp;
|
khdr->addr = addrtmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (khdr->msgctrl) {
|
if (khdr->msgctrl && khdr->ctrllen) {
|
||||||
void *ctrltmp = alloc(khdr->ctrllen);
|
void *ctrltmp = alloc(khdr->ctrllen);
|
||||||
if (ctrltmp == NULL) {
|
if (ctrltmp == NULL) {
|
||||||
if (khdr->addr)
|
if (khdr->addr)
|
||||||
free(khdr->addr);
|
free(khdr->addr);
|
||||||
free(iovectmp);
|
if (iovectmp)
|
||||||
|
free(iovectmp);
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usercopy_fromuser(ctrltmp, khdr->msgctrl, khdr->ctrllen)) {
|
if (usercopy_fromuser(ctrltmp, khdr->msgctrl, khdr->ctrllen)) {
|
||||||
if (khdr->addr)
|
if (khdr->addr)
|
||||||
free(khdr->addr);
|
free(khdr->addr);
|
||||||
free(iovectmp);
|
if (iovectmp)
|
||||||
|
free(iovectmp);
|
||||||
|
free(ctrltmp);
|
||||||
return EFAULT;
|
return EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
khdr->msgctrl = ctrltmp;
|
khdr->msgctrl = ctrltmp;
|
||||||
|
} else {
|
||||||
|
khdr->msgctrl = NULL;
|
||||||
|
khdr->ctrllen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user