On Tue, Aug 7, 2018 at 5:49 AM, Charles Myers <[email protected]> wrote:
> Signed-off-by: Charles Myers <[email protected]> > --- > bsd/sys/compat/linux/linux_ioctl.cc | 37 ++++++++++++++++++++++++++++++ > +++---- > 1 file changed, 33 insertions(+), 4 deletions(-) > > diff --git a/bsd/sys/compat/linux/linux_ioctl.cc > b/bsd/sys/compat/linux/linux_ioctl.cc > index 43a50bb..d49386d 100644 > --- a/bsd/sys/compat/linux/linux_ioctl.cc > +++ b/bsd/sys/compat/linux/linux_ioctl.cc > @@ -43,8 +43,8 @@ > #include <bsd/sys/net/if_dl.h> > #include <bsd/sys/net/if_types.h> > > -#include <bsd/sys/compat/linux/linux_socket.h> > #include <bsd/sys/compat/linux/linux.h> > +#include <bsd/sys/compat/linux/linux_socket.h> > > #include <osv/file.h> > #include <osv/socket.hh> > @@ -199,6 +199,17 @@ linux_gifhwaddr(struct ifnet *ifp, struct l_ifreq > *ifr) > return (ENOENT); > } > > +static int > +linux_sifname(socket_file *fp, struct l_ifreq *data) > +{ > + struct bsd_ifreq ifreq; > + > + // FreeBSD ifreq uses a pointer to the new name string instead of > including it in the struct > + memcpy((char *)&ifreq, data->ifr_name, IFNAMSIZ); > Wouldn't it be better to use strncpy instead of memcpy? So that if the string is shorter than IFNAMSIZ we don't try to read beyond its end? > + ifreq.ifr_ifru.ifru_data = (caddr_t)(data->ifr_ifru.ifru_newname); > Is this the only field in ifreq we need to fill? + > + return fp->bsd_ioctl(SIOCSIFNAME, &ifreq); > +} > > /* > * Fix the interface address field in bsd_ifreq. The bsd stack expects a > @@ -223,6 +234,16 @@ linux_to_bsd_ifreq(struct bsd_ifreq *ifr_p) > } > > /* > + * FreeBSD ifru_index is short but Linux is an int so need to clear extra > bits. > Doesn't bsd_to_linux_ifreq do among other things, also this? Maybe not, I'm not familiar with the details. + */ > +static inline void > +bsd_to_linux_ifreq_ifindex(struct bsd_ifreq *ifr_p) > +{ > + void *ptr = &ifr_p->ifr_index; > + *(int *)(ptr) = ifr_p->ifr_index; > +} > + > +/* > * Socket related ioctls > */ > > @@ -241,8 +262,8 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void > *data) > switch (cmd) { > case SIOCSIFADDR: > case SIOCSIFNETMASK: > - case SIOCSIFDSTADDR: > - case SIOCSIFBRDADDR: > + case SIOCSIFDSTADDR: > + case SIOCSIFBRDADDR: > if ((ifp = ifunit_ref((char *)data)) == NULL) > return (EINVAL); > linux_to_bsd_ifreq((struct bsd_ifreq *)data) ; > @@ -251,10 +272,16 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void > *data) > > case SIOCGIFMTU: > case SIOCSIFMTU: > + if ((ifp = ifunit_ref((char *)data)) == NULL) > + return (EINVAL); > + error = fp->bsd_ioctl(cmd, data); > + break; > + > case SIOCGIFINDEX: > if ((ifp = ifunit_ref((char *)data)) == NULL) > return (EINVAL); > error = fp->bsd_ioctl(cmd, data); > + bsd_to_linux_ifreq_ifindex((struct bsd_ifreq *)data); > break; > > case SIOCGIFADDR: > @@ -278,7 +305,9 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void > *data) > break; > > case SIOCSIFNAME: > - error = ENOIOCTL; > + if ((ifp = ifunit_ref((char *)data)) == NULL) > + return (EINVAL); > + error = linux_sifname(fp, (struct l_ifreq *)data); > break; > > case SIOCGIFHWADDR: > -- > 2.7.4 > > -- > You received this message because you are subscribed to the Google Groups > "OSv Development" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
