FreeBSD Bugzilla – Attachment 93574 Details for
Bug 131513
[patch] unbreak sysutils/p5-BSD-Jail-Object after jail MFC
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
file.diff
file.diff (text/plain), 4.75 KB, created by
Bjoern A. Zeeb
on 2009-02-08 21:40:04 UTC
(
hide
)
Description:
file.diff
Filename:
MIME Type:
Creator:
Bjoern A. Zeeb
Created:
2009-02-08 21:40:04 UTC
Size:
4.75 KB
patch
obsolete
>Index: Makefile >=================================================================== >RCS file: /shared/mirror/FreeBSD/r/pcvs/ports/sysutils/p5-BSD-Jail-Object/Makefile,v >retrieving revision 1.5 >diff -u -p -r1.5 Makefile >--- Makefile 8 Jan 2009 18:08:08 -0000 1.5 >+++ Makefile 8 Feb 2009 17:00:45 -0000 >@@ -7,6 +7,7 @@ > > PORTNAME= BSD-Jail-Object > PORTVERSION= 0.02 >+PORTREVISION= 1 > CATEGORIES= sysutils perl5 > MASTER_SITES= CPAN > PKGNAMEPREFIX= p5- >@@ -21,10 +22,4 @@ PERL_CONFIGURE= 5.8.6+ > > MAN3= BSD::Jail::Object.3 > >-.include <bsd.port.pre.mk> >- >-.if ${OSVERSION} >= 800056 >-BROKEN= does not build >-.endif >- >-.include <bsd.port.post.mk> >+.include <bsd.port.mk> >Index: files/patch-Object.pm >=================================================================== >RCS file: files/patch-Object.pm >diff -N files/patch-Object.pm >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ files/patch-Object.pm 8 Feb 2009 17:00:45 -0000 >@@ -0,0 +1,149 @@ >+! >+! - Plug a memory used after free. >+! - Try to make things work basically with modern jails >+! (read "make work" as "compile"). >+! Ideally one would change the internal API and return arrayrefs >+! of IPs per address family as well as jailname, ... for the new >+! version and keep compat. Most likely one would need to keep the >+! version information along with the cached data. >+! Look at usr.sbin/{jail,jls,jexec} sources for the right ideas. >+! >+--- ./Object.pm.orig 2006-08-08 04:54:29.000000000 +0000 >++++ ./Object.pm 2008-12-28 14:06:27.000000000 +0000 >+@@ -317,21 +317,69 @@ >+ return NULL; >+ } >+ >+- free( sxp ); >+ return xp; >+ } >+ >++static int >++_is_jail_ip4(char *string, struct xprison *xp) >++{ >++ struct in_addr in; >++#if ((__FreeBSD_version >= 800056) || (__FreeBSD_version < 800000) && (__FreeBSD_version >= 701103)) >++ struct in_addr *iap; >++ char *q; >++ int i; >++#endif >++ >++ if (inet_pton(AF_INET, string, &in) != 1) >++ return (0); >++ >++#if ((__FreeBSD_version >= 800000 && __FreeBSD_version < 800056) || __FreeBSD_version < 701103) >++ if (in.s_addr == xp->pr_ip) { >++ return (1); >++#else >++ if (xp->pr_ip4s == 0) >++ return (0); >++ q = (char *)(xp + 1); >++ iap = (struct in_addr *)(void *)q; >++ for (i=0; i < xp->pr_ip4s; i++) >++ if (in.s_addr == iap[i].s_addr) >++ return (1); >++#endif >++ return (0); >++} >++ >++static void >++_get_jail_ip4(struct xprison *xp, struct in_addr *ia) >++{ >++#if ((__FreeBSD_version >= 800056) || (__FreeBSD_version < 800000) && (__FreeBSD_version >= 701103)) >++ struct in_addr *iap; >++ char *q; >++#endif >++ >++#if ((__FreeBSD_version >= 800000 && __FreeBSD_version < 800056) || __FreeBSD_version < 701103) >++ ia->s_addr = xp->pr_ip; >++#else >++ if (xp->pr_ip4s == 0) >++ ia->s_addr = 0; >++ else { >++ q = (char *)(xp + 1); >++ iap = (struct in_addr *)(void *)q; >++ ia->s_addr = iap[0].s_addr; >++ } >++#endif >++} >++ >+ // fetch a specific jail's information >+ void >+ _find_jail( int compare, char *string ) >+ { >+- struct xprison *xp; >++ struct xprison *sxp, *xp; >+ struct in_addr in; >+ size_t i, len; >+ Inline_Stack_Vars; >+ >+ Inline_Stack_Reset; >+- xp = get_xp(); >++ sxp = xp = get_xp(); >+ len = sysctl_len(); >+ >+ /* >+@@ -341,15 +389,15 @@ >+ */ >+ >+ for (i = 0; i < len / sizeof(*xp); i++) { >+- in.s_addr = ntohl(xp->pr_ip); >+ if ( >+ ( compare == 0 && xp->pr_id == atoi(string) ) >+ || >+- ( compare == 1 && strcmp( string, inet_ntoa(in) ) == 0 ) >++ ( compare == 1 && _is_jail_ip4(string, xp) ) >+ || >+ ( compare == 2 && strcmp( string, xp->pr_host ) == 0 ) >+ ) { >+ Inline_Stack_Push( sv_2mortal( newSViv( xp->pr_id ) )); >++ _get_jail_ip4(xp, &in); >+ Inline_Stack_Push( sv_2mortal( newSVpvf( inet_ntoa(in) ) )); >+ Inline_Stack_Push( sv_2mortal( newSVpvf( xp->pr_host ) )); >+ Inline_Stack_Push( sv_2mortal( newSVpvf( xp->pr_path ) )); >+@@ -360,6 +408,7 @@ >+ } >+ } >+ >++ free ( sxp ); >+ Inline_Stack_Done; >+ } >+ >+@@ -367,12 +416,12 @@ >+ void >+ _find_jids() >+ { >+- struct xprison *xp; >++ struct xprison *sxp, *xp; >+ size_t i, len; >+ Inline_Stack_Vars; >+ >+ Inline_Stack_Reset; >+- xp = get_xp(); >++ sxp = xp = get_xp(); >+ len = sysctl_len(); >+ >+ for (i = 0; i < len / sizeof(*xp); i++) { >+@@ -380,6 +429,7 @@ >+ xp++; >+ } >+ >++ free ( sxp ); >+ Inline_Stack_Done; >+ } >+ >+@@ -402,8 +452,14 @@ >+ >+ j.path = path; >+ j.hostname = hostname; >++#if ((__FreeBSD_version >= 800000 && __FreeBSD_version < 800056) || __FreeBSD_version < 701103) >+ j.ip_number = ntohl( ip.s_addr ); >+ j.version = 0; >++#else >++ j.version = JAIL_API_VERSION; >++ j.ip4s = 1; >++ j.ip4 = &ip; >++#endif >+ >+ if ( (jid = jail( &j )) == -1 ) return 0; >+
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 131513
: 93574