On Fri, Mar 27, 2020 at 03:16:54PM +0300, Vitaliy Makkoveev wrote:
> On Fri, Mar 27, 2020 at 10:43:52AM +0100, Martin Pieuchot wrote:
> > Do you have a backtrace for the memory corruption?  Could you share it?
> Yes. Apply path below, compile and run code, and when you had see
> "pipex_session ... killed" kill this code. Screenshot attached.
> STABLE-6.[56] are affected too.
> 
> ---- cut begin ----
> 
> #include <sys/types.h>
> #include <sys/ioctl.h>
> #include <sys/select.h>
> #include <sys/socket.h>
> #include <sys/stat.h>
> #include <stdio.h>
> #include <err.h>
> #include <fcntl.h>
> #include <string.h>
> 
> #include <arpa/inet.h>
> #include <netinet/in.h>
> #include <net/if.h>
> #include <net/pipex.h>
> 
> int main(void)
> {
>       int fd;
>       struct pipex_session_req req;
> 
>       if((fd=open("/dev/pppx0", O_RDWR))<0){
>               err(1, "open()");
>       }
> 
>       memset(&req, 0, sizeof(req));
> 
>       req.pr_timeout_sec=0;
Sorry, this line should be "req.pr_timeout_sec=1;"

> 
>       req.pr_protocol=PIPEX_PROTO_L2TP;
>       req.pr_local_address.ss_family=AF_INET;
>       req.pr_local_address.ss_len=sizeof(struct sockaddr_in);
>       req.pr_peer_address.ss_family=AF_INET;
>       req.pr_peer_address.ss_len=sizeof(struct sockaddr_in);
> 
>       if(ioctl(fd, PIPEXASESSION, &req)<0){
>               err(1, "ioctl()");
>       }
> 
>       select(0, NULL, NULL, NULL, NULL);
> 
>       return 0;
> }
> 
> ---- cut end ----
> 
> Index: sys/net/if_pppx.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pppx.c,v
> retrieving revision 1.77
> diff -u -p -r1.77 if_pppx.c
> --- sys/net/if_pppx.c 26 Mar 2020 16:50:46 -0000      1.77
> +++ sys/net/if_pppx.c 27 Mar 2020 12:02:33 -0000
> @@ -665,6 +665,12 @@ pppx_add_session(struct pppx_dev *pxd, s
>       struct ifnet *over_ifp = NULL;
>  #endif
>  
> +#if 0
> +     /* XXX: prevent pxi destruction by pipex_timer() */
> +     if (req->pr_timeout_sec != 0)
> +             return (EINVAL);
> +#endif
> +
>       switch (req->pr_protocol) {
>  #ifdef PIPEX_PPPOE
>       case PIPEX_PROTO_PPPOE:
> @@ -706,6 +712,11 @@ pppx_add_session(struct pppx_dev *pxd, s
>       pxi = pool_get(pppx_if_pl, PR_WAITOK | PR_ZERO);
>       if (pxi == NULL)
>               return (ENOMEM);
> +     
> +#if 1
> +     printf("%s: new pppx_if pipex_session %p timeout %u\n",
> +             __func__, &pxi->pxi_session, req->pr_timeout_sec);
> +#endif
>  
>       session = &pxi->pxi_session;
>       ifp = &pxi->pxi_if;
> Index: sys/net/pipex.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pipex.c,v
> retrieving revision 1.109
> diff -u -p -r1.109 pipex.c
> --- sys/net/pipex.c   26 Mar 2020 16:50:46 -0000      1.109
> +++ sys/net/pipex.c   27 Mar 2020 12:02:34 -0000
> @@ -767,6 +767,10 @@ pipex_timer(void *ignored_arg)
>                       session->stat.idle_time++;
>                       if (session->stat.idle_time < session->timeout_sec)
>                               continue;
> +#if 1
> +                     printf("%s: pipex_session %p timeout\n",
> +                             __func__, session);
> +#endif
>  
>                       pipex_notify_close_session(session);
>                       break;
> @@ -792,6 +796,10 @@ pipex_timer(void *ignored_arg)
>                               continue;
>  
>                       pipex_destroy_session(session);
> +#if 1
> +                     printf("%s: pipex_session %p killed\n",
> +                             __func__, session);
> +#endif
>                       break;
>  
>               default:


Reply via email to