Skip to content

Commit 479e291

Browse files
committed
linux: make linux_to_bsd_sockaddr() use memory supplied by caller
No functional change. Differential Revision: https://reviews.freebsd.org/D52936
1 parent be7bdb1 commit 479e291

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

sys/compat/linux/linux.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,13 @@ bsd_to_linux_sockaddr(const struct sockaddr *sa, struct l_sockaddr **lsa,
578578
return (0);
579579
}
580580

581+
/*
582+
* If sap is NULL, then osa points at already copied in linux sockaddr that
583+
* should be edited in place. Otherwise memory is allocated, sockaddr
584+
* copied in and returned in *sap.
585+
*/
581586
int
582-
linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
587+
linux_to_bsd_sockaddr(struct l_sockaddr *osa, struct sockaddr **sap,
583588
socklen_t *len)
584589
{
585590
struct sockaddr *sa;
@@ -609,10 +614,12 @@ linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
609614
}
610615
#endif
611616

612-
kosa = malloc(salen, M_SONAME, M_WAITOK);
613-
614-
if ((error = copyin(osa, kosa, *len)))
615-
goto out;
617+
if (sap != NULL) {
618+
kosa = malloc(salen, M_SONAME, M_WAITOK);
619+
if ((error = copyin(osa, kosa, *len)))
620+
goto out;
621+
} else
622+
kosa = osa;
616623

617624
bdom = linux_to_bsd_domain(kosa->sa_family);
618625
if (bdom == AF_UNKNOWN) {
@@ -686,12 +693,15 @@ linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
686693
sa->sa_family = bdom;
687694
sa->sa_len = salen;
688695

689-
*sap = sa;
690-
*len = salen;
696+
if (sap != NULL) {
697+
*sap = sa;
698+
*len = salen;
699+
}
691700
return (0);
692701

693702
out:
694-
free(kosa, M_SONAME);
703+
if (sap != NULL)
704+
free(kosa, M_SONAME);
695705
return (error);
696706
}
697707

sys/compat/linux/linux_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ sa_family_t bsd_to_linux_domain(sa_family_t domain);
4343
#define AF_UNKNOWN UINT8_MAX
4444
int bsd_to_linux_sockaddr(const struct sockaddr *sa,
4545
struct l_sockaddr **lsa, socklen_t len);
46-
int linux_to_bsd_sockaddr(const struct l_sockaddr *lsa,
46+
int linux_to_bsd_sockaddr(struct l_sockaddr *lsa,
4747
struct sockaddr **sap, socklen_t *len);
4848
void linux_to_bsd_poll_events(struct thread *td, int fd,
4949
short lev, short *bev);

0 commit comments

Comments
 (0)