Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Nov 2009 19:26:17 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r199492 - in head/sys: amd64/amd64 i386/i386 net
Message-ID:  <200911181926.nAIJQHOR081471@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Wed Nov 18 19:26:17 2009
New Revision: 199492
URL: http://svn.freebsd.org/changeset/base/199492

Log:
  - Make BPF JIT compiler working again in userland.  We are limiting size of
  generated native binary to page size for now.
  - Update copyright date and fix some style nits.

Modified:
  head/sys/amd64/amd64/bpf_jit_machdep.c
  head/sys/amd64/amd64/bpf_jit_machdep.h
  head/sys/i386/i386/bpf_jit_machdep.c
  head/sys/i386/i386/bpf_jit_machdep.h
  head/sys/net/bpf_jitter.c
  head/sys/net/bpf_jitter.h

Modified: head/sys/amd64/amd64/bpf_jit_machdep.c
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.c	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/amd64/amd64/bpf_jit_machdep.c	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
 #include <net/if.h>
 #else
 #include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/param.h>
 #endif
 
 #include <sys/types.h>
@@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int 
 bpf_filter_func
 bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
 {
+	bpf_bin_stream stream;
 	struct bpf_insn *ins;
 	u_int i, pass;
-	bpf_bin_stream stream;
 
 	/*
 	 * NOTE: do not modify the name of this variable, as it's used by
@@ -475,20 +477,31 @@ bpf_jit_compile(struct bpf_insn *prog, u
 		}
 
 		pass++;
-		if (pass == 2)
+		if (pass >= 2) {
+#ifndef _KERNEL
+			if (mprotect(stream.ibuf, stream.cur_ip,
+			    PROT_READ | PROT_EXEC) != 0) {
+				munmap(stream.ibuf, BPF_JIT_MAXSIZE);
+				stream.ibuf = NULL;
+			}
+#endif
 			break;
+		}
 
 #ifdef _KERNEL
 		stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT);
-		if (stream.ibuf == NULL) {
-			free(stream.refs, M_BPFJIT);
-			return (NULL);
-		}
+		if (stream.ibuf == NULL)
+			break;
 #else
-		stream.ibuf = (char *)malloc(stream.cur_ip);
-		if (stream.ibuf == NULL) {
-			free(stream.refs);
-			return (NULL);
+		if (stream.cur_ip > BPF_JIT_MAXSIZE) {
+			stream.ibuf = NULL;
+			break;
+		}
+		stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE,
+		    PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
+		if (stream.ibuf == MAP_FAILED) {
+			stream.ibuf = NULL;
+			break;
 		}
 #endif
 

Modified: head/sys/amd64/amd64/bpf_jit_machdep.h
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.h	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/amd64/amd64/bpf_jit_machdep.h	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without

Modified: head/sys/i386/i386/bpf_jit_machdep.c
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.c	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/i386/i386/bpf_jit_machdep.c	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
 #include <net/if.h>
 #else
 #include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/param.h>
 #endif
 
 #include <sys/types.h>
@@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int 
 bpf_filter_func
 bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
 {
+	bpf_bin_stream stream;
 	struct bpf_insn *ins;
 	u_int i, pass;
-	bpf_bin_stream stream;
 
 	/*
 	 * NOTE: do not modify the name of this variable, as it's used by
@@ -498,20 +500,31 @@ bpf_jit_compile(struct bpf_insn *prog, u
 		}
 
 		pass++;
-		if (pass == 2)
+		if (pass >= 2) {
+#ifndef _KERNEL
+			if (mprotect(stream.ibuf, stream.cur_ip,
+			    PROT_READ | PROT_EXEC) != 0) {
+				munmap(stream.ibuf, BPF_JIT_MAXSIZE);
+				stream.ibuf = NULL;
+			}
+#endif
 			break;
+		}
 
 #ifdef _KERNEL
 		stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT);
-		if (stream.ibuf == NULL) {
-			free(stream.refs, M_BPFJIT);
-			return (NULL);
-		}
+		if (stream.ibuf == NULL)
+			break;
 #else
-		stream.ibuf = (char *)malloc(stream.cur_ip);
-		if (stream.ibuf == NULL) {
-			free(stream.refs);
-			return (NULL);
+		if (stream.cur_ip > BPF_JIT_MAXSIZE) {
+			stream.ibuf = NULL;
+			break;
+		}
+		stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE,
+		    PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
+		if (stream.ibuf == MAP_FAILED) {
+			stream.ibuf = NULL;
+			break;
 		}
 #endif
 

Modified: head/sys/i386/i386/bpf_jit_machdep.h
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.h	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/i386/i386/bpf_jit_machdep.h	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without

Modified: head/sys/net/bpf_jitter.c
==============================================================================
--- head/sys/net/bpf_jitter.c	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/net/bpf_jitter.c	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$");
 #else
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
+#include <sys/param.h>
 #include <sys/types.h>
 #endif
 
@@ -127,7 +129,7 @@ bpf_destroy_jit_filter(bpf_jit_filter *f
 {
 
 	if (filter->func != bpf_jit_accept_all)
-		free(filter->func);
+		munmap(filter->func, BPF_JIT_MAXSIZE);
 	free(filter);
 }
 #endif

Modified: head/sys/net/bpf_jitter.h
==============================================================================
--- head/sys/net/bpf_jitter.h	Wed Nov 18 18:48:18 2009	(r199491)
+++ head/sys/net/bpf_jitter.h	Wed Nov 18 19:26:17 2009	(r199492)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,6 +36,8 @@
 
 #ifdef _KERNEL
 MALLOC_DECLARE(M_BPFJIT);
+#else
+#define	BPF_JIT_MAXSIZE		PAGE_SIZE
 #endif
 
 extern int bpf_jitter_enable;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911181926.nAIJQHOR081471>