Changeset View
Changeset View
Standalone View
Standalone View
sysutils/p5-BSD-Jail-Object/files/patch-Object.pm
! | ! | ||||
! - Plug a memory used after free. | ! - Plug a memory used after free. | ||||
! - Try to make things work basically with modern jails | ! - Try to make things work basically with modern jails | ||||
! (read "make work" as "compile"). | ! (read "make work" as "compile"). | ||||
! Ideally one would change the internal API and return arrayrefs | ! Ideally one would change the internal API and return arrayrefs | ||||
! of IPs per address family as well as jailname, ... for the new | ! 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 and keep compat. Most likely one would need to keep the | ||||
! version information along with the cached data. | ! version information along with the cached data. | ||||
! Look at usr.sbin/{jail,jls,jexec} sources for the right ideas. | ! 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.orig 2006-08-08 04:54:29 UTC | ||||
+++ ./Object.pm 2008-12-28 14:06:27.000000000 +0000 | +++ Object.pm | ||||
@@ -317,21 +317,69 @@ | @@ -317,21 +317,56 @@ struct xprison | ||||
return NULL; | return NULL; | ||||
} | } | ||||
- free( sxp ); | - free( sxp ); | ||||
return xp; | return xp; | ||||
} | } | ||||
+static int | +static int | ||||
+_is_jail_ip4(char *string, struct xprison *xp) | +_is_jail_ip4(char *string, struct xprison *xp) | ||||
+{ | +{ | ||||
+ struct in_addr in; | + struct in_addr in; | ||||
+#if ((__FreeBSD_version >= 800056) || (__FreeBSD_version < 800000) && (__FreeBSD_version >= 701103)) | |||||
+ struct in_addr *iap; | + struct in_addr *iap; | ||||
+ char *q; | + char *q; | ||||
+ int i; | + int i; | ||||
+#endif | |||||
+ | + | ||||
+ if (inet_pton(AF_INET, string, &in) != 1) | + if (inet_pton(AF_INET, string, &in) != 1) | ||||
+ return (0); | + 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) | + if (xp->pr_ip4s == 0) | ||||
+ return (0); | + return (0); | ||||
+ q = (char *)(xp + 1); | + q = (char *)(xp + 1); | ||||
+ iap = (struct in_addr *)(void *)q; | + iap = (struct in_addr *)(void *)q; | ||||
+ for (i=0; i < xp->pr_ip4s; i++) | + for (i=0; i < xp->pr_ip4s; i++) | ||||
+ if (in.s_addr == iap[i].s_addr) | + if (in.s_addr == iap[i].s_addr) | ||||
+ return (1); | + return (1); | ||||
+#endif | |||||
+ return (0); | + return (0); | ||||
+} | +} | ||||
+ | + | ||||
+static void | +static void | ||||
+_get_jail_ip4(struct xprison *xp, struct in_addr *ia) | +_get_jail_ip4(struct xprison *xp, struct in_addr *ia) | ||||
+{ | +{ | ||||
+#if ((__FreeBSD_version >= 800056) || (__FreeBSD_version < 800000) && (__FreeBSD_version >= 701103)) | |||||
+ struct in_addr *iap; | + struct in_addr *iap; | ||||
+ char *q; | + 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) | + if (xp->pr_ip4s == 0) | ||||
+ ia->s_addr = 0; | + ia->s_addr = 0; | ||||
+ else { | + else { | ||||
+ q = (char *)(xp + 1); | + q = (char *)(xp + 1); | ||||
+ iap = (struct in_addr *)(void *)q; | + iap = (struct in_addr *)(void *)q; | ||||
+ ia->s_addr = iap[0].s_addr; | + ia->s_addr = iap[0].s_addr; | ||||
+ } | + } | ||||
+#endif | |||||
+} | +} | ||||
+ | + | ||||
// fetch a specific jail's information | // fetch a specific jail's information | ||||
void | void | ||||
_find_jail( int compare, char *string ) | _find_jail( int compare, char *string ) | ||||
{ | { | ||||
- struct xprison *xp; | - struct xprison *xp; | ||||
+ struct xprison *sxp, *xp; | + struct xprison *sxp, *xp; | ||||
struct in_addr in; | struct in_addr in; | ||||
size_t i, len; | size_t i, len; | ||||
Inline_Stack_Vars; | Inline_Stack_Vars; | ||||
Inline_Stack_Reset; | Inline_Stack_Reset; | ||||
- xp = get_xp(); | - xp = get_xp(); | ||||
+ sxp = xp = get_xp(); | + sxp = xp = get_xp(); | ||||
len = sysctl_len(); | len = sysctl_len(); | ||||
/* | /* | ||||
@@ -341,15 +389,15 @@ | @@ -341,15 +376,15 @@ _find_jail( int compare, char *string ) | ||||
*/ | */ | ||||
for (i = 0; i < len / sizeof(*xp); i++) { | for (i = 0; i < len / sizeof(*xp); i++) { | ||||
- in.s_addr = ntohl(xp->pr_ip); | - in.s_addr = ntohl(xp->pr_ip); | ||||
if ( | if ( | ||||
( compare == 0 && xp->pr_id == atoi(string) ) | ( compare == 0 && xp->pr_id == atoi(string) ) | ||||
|| | || | ||||
- ( compare == 1 && strcmp( string, inet_ntoa(in) ) == 0 ) | - ( compare == 1 && strcmp( string, inet_ntoa(in) ) == 0 ) | ||||
+ ( compare == 1 && _is_jail_ip4(string, xp) ) | + ( compare == 1 && _is_jail_ip4(string, xp) ) | ||||
|| | || | ||||
( compare == 2 && strcmp( string, xp->pr_host ) == 0 ) | ( compare == 2 && strcmp( string, xp->pr_host ) == 0 ) | ||||
) { | ) { | ||||
Inline_Stack_Push( sv_2mortal( newSViv( xp->pr_id ) )); | Inline_Stack_Push( sv_2mortal( newSViv( xp->pr_id ) )); | ||||
+ _get_jail_ip4(xp, &in); | + _get_jail_ip4(xp, &in); | ||||
Inline_Stack_Push( sv_2mortal( newSVpvf( inet_ntoa(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_host ) )); | ||||
Inline_Stack_Push( sv_2mortal( newSVpvf( xp->pr_path ) )); | Inline_Stack_Push( sv_2mortal( newSVpvf( xp->pr_path ) )); | ||||
@@ -360,6 +408,7 @@ | @@ -360,6 +395,7 @@ _find_jail( int compare, char *string ) | ||||
} | } | ||||
} | } | ||||
+ free ( sxp ); | + free ( sxp ); | ||||
Inline_Stack_Done; | Inline_Stack_Done; | ||||
} | } | ||||
@@ -367,12 +416,12 @@ | @@ -367,12 +403,12 @@ _find_jail( int compare, char *string ) | ||||
void | void | ||||
_find_jids() | _find_jids() | ||||
{ | { | ||||
- struct xprison *xp; | - struct xprison *xp; | ||||
+ struct xprison *sxp, *xp; | + struct xprison *sxp, *xp; | ||||
size_t i, len; | size_t i, len; | ||||
Inline_Stack_Vars; | Inline_Stack_Vars; | ||||
Inline_Stack_Reset; | Inline_Stack_Reset; | ||||
- xp = get_xp(); | - xp = get_xp(); | ||||
+ sxp = xp = get_xp(); | + sxp = xp = get_xp(); | ||||
len = sysctl_len(); | len = sysctl_len(); | ||||
for (i = 0; i < len / sizeof(*xp); i++) { | for (i = 0; i < len / sizeof(*xp); i++) { | ||||
@@ -380,6 +429,7 @@ | @@ -380,6 +416,7 @@ _find_jids() | ||||
xp++; | xp++; | ||||
} | } | ||||
+ free ( sxp ); | + free ( sxp ); | ||||
Inline_Stack_Done; | Inline_Stack_Done; | ||||
} | } | ||||
@@ -402,8 +452,14 @@ | @@ -402,8 +439,9 @@ _create( char *path, char *hostname, char *ipaddr ) | ||||
j.path = path; | j.path = path; | ||||
j.hostname = hostname; | j.hostname = hostname; | ||||
+#if ((__FreeBSD_version >= 800000 && __FreeBSD_version < 800056) || __FreeBSD_version < 701103) | - j.ip_number = ntohl( ip.s_addr ); | ||||
j.ip_number = ntohl( ip.s_addr ); | - j.version = 0; | ||||
j.version = 0; | |||||
+#else | |||||
+ j.version = JAIL_API_VERSION; | + j.version = JAIL_API_VERSION; | ||||
+ j.ip4s = 1; | + j.ip4s = 1; | ||||
+ j.ip4 = &ip; | + j.ip4 = &ip; | ||||
+#endif | |||||
if ( (jid = jail( &j )) == -1 ) return 0; | if ( (jid = jail( &j )) == -1 ) return 0; | ||||