sock: fix some memory leaks and correctness in copyhdr

This commit is contained in:
Matheus
2026-06-04 13:16:14 -03:00
parent 6bea8d8518
commit f7dd3fe17d
+24 -10
View File
@@ -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;