netcred free(9) sizes

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

netcred free(9) sizes

Martin Pieuchot
Keep track of the allocated size and use it later :)

ok?

Index: kern/vfs_subr.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_subr.c,v
retrieving revision 1.282
diff -u -p -r1.282 vfs_subr.c
--- kern/vfs_subr.c 29 Sep 2018 04:29:48 -0000 1.282
+++ kern/vfs_subr.c 18 Nov 2018 16:05:25 -0000
@@ -1424,6 +1424,7 @@ vfs_hang_addrlist(struct mount *mp, stru
  return (EINVAL);
  nplen = sizeof(struct netcred) + argp->ex_addrlen + argp->ex_masklen;
  np = (struct netcred *)malloc(nplen, M_NETADDR, M_WAITOK|M_ZERO);
+ np->netc_len = nplen;
  saddr = (struct sockaddr *)(np + 1);
  error = copyin(argp->ex_addr, saddr, argp->ex_addrlen);
  if (error)
@@ -1466,7 +1467,7 @@ finish:
  np->netc_exflags = argp->ex_flags;
  return (0);
 out:
- free(np, M_NETADDR, nplen);
+ free(np, M_NETADDR, np->netc_len);
  return (error);
 }
 
@@ -1474,9 +1475,10 @@ int
 vfs_free_netcred(struct radix_node *rn, void *w, u_int id)
 {
  struct radix_node_head *rnh = (struct radix_node_head *)w;
+ struct netcred * np = (struct netcred *)rn;
 
  rn_delete(rn->rn_key, rn->rn_mask, rnh, NULL);
- free(rn, M_NETADDR, 0);
+ free(np, M_NETADDR, np->netc_len);
  return (0);
 }
 
@@ -1490,7 +1492,7 @@ vfs_free_addrlist(struct netexport *nep)
 
  if ((rnh = nep->ne_rtable_inet) != NULL) {
  rn_walktree(rnh, vfs_free_netcred, rnh);
- free(rnh, M_RTABLE, 0);
+ free(rnh, M_RTABLE, sizeof(*rnh));
  nep->ne_rtable_inet = NULL;
  }
 }
Index: sys/mount.h
===================================================================
RCS file: /cvs/src/sys/sys/mount.h,v
retrieving revision 1.142
diff -u -p -r1.142 mount.h
--- sys/mount.h 29 Sep 2018 04:29:48 -0000 1.142
+++ sys/mount.h 18 Nov 2018 16:00:22 -0000
@@ -552,6 +552,7 @@ struct vfsops {
 struct netcred {
  struct radix_node netc_rnodes[2];
  int netc_exflags;
+ int netc_len; /* size of the allocation */
  struct ucred netc_anon;
 };