If this were a perf-critical path I'd be more concerned about the cost of calling a function, but it isn't and I'm not. In most of these cases, right after malloc()ing a page-sized buffer it then makes a string of syscalls. In the ones I see, what's really going on is that it's just trying to allocate a chunk of memory in a VM-friendly size; it then does a page-sized read, write or similar, and doesn't extend the buffer if a page turns out to be too small. I'm a little dubious about this code -- while its buffer edits are for the most part properly bounds-checked, I don't see any particular guarantee that one page is enough for what's being copied in; the authors seem simply to have chosen it as a "large enough" amount.
Be that as it may, Steve's correct that the PAGE_SIZE constant isn't a good way to get the page size, since it can't accomodate variable page size architectures (sparc, mips). Using it as a "largeish buffer the VM can easily allocate" isn't even a good strategy once the malloc overhead is taken into account, to say nothing of HUGETLB's 4MB page sizes, e.g. However, concerning my own patch, I find the manpage warning that SUSv2 considers getpagesize() a deprecated call; the SUSv3 spec doesn't list it at all. What it does list is sysconf(), where the equivalent call is sysconf(_SC_PAGE_SIZE). What was wrong with getpagesize() I don't know. I'm attaching an updated patch which uses sysconf(), though I think a better fix would be for upstream to be less sloppy about their buffers. -- Devin \ aqua(at)devin.com, IRC:Requiem; http://www.devin.com Carraway \ 1024D/E9ABFCD2: 13E7 199E DD1E 65F0 8905 2E43 5395 CA0D E9AB FCD2
--- libselinux-1.30.orig/src/canonicalize_context.c +++ libselinux-1.30/src/canonicalize_context.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -23,7 +22,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/compute_av.c +++ libselinux-1.30/src/compute_av.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -26,7 +25,7 @@ if (fd < 0) return -1; - len = PAGE_SIZE; + len = sysconf(_SC_PAGE_SIZE); buf = malloc(len); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/compute_create.c +++ libselinux-1.30/src/compute_create.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -25,7 +24,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/compute_member.c +++ libselinux-1.30/src/compute_member.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -25,7 +24,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/compute_relabel.c +++ libselinux-1.30/src/compute_relabel.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -25,7 +24,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/compute_user.c +++ libselinux-1.30/src/compute_user.c @@ -5,7 +5,6 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" #include <limits.h> @@ -26,7 +25,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/enabled.c +++ libselinux-1.30/src/enabled.c @@ -5,7 +5,6 @@ #include <stdlib.h> #include <errno.h> #include <limits.h> -#include <asm/page.h> #include <stdio.h> #include "policy.h" @@ -22,7 +21,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { enabled = -1; --- libselinux-1.30.orig/src/getcon.c +++ libselinux-1.30/src/getcon.c @@ -4,7 +4,6 @@ #include "selinux_internal.h" #include <stdlib.h> #include <errno.h> -#include <asm/page.h> #include "policy.h" int getcon_raw(security_context_t *context) @@ -18,7 +17,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/getexeccon.c +++ libselinux-1.30/src/getexeccon.c @@ -3,7 +3,6 @@ #include <string.h> #include <stdlib.h> #include <errno.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" @@ -18,7 +17,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/getfscreatecon.c +++ libselinux-1.30/src/getfscreatecon.c @@ -3,7 +3,6 @@ #include <string.h> #include <stdlib.h> #include <errno.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" @@ -18,7 +17,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/getpidcon.c +++ libselinux-1.30/src/getpidcon.c @@ -4,7 +4,6 @@ #include <stdio.h> #include <stdlib.h> #include <errno.h> -#include <asm/page.h> #include "selinux_internal.h" #include "policy.h" @@ -22,7 +21,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/getprevcon.c +++ libselinux-1.30/src/getprevcon.c @@ -4,7 +4,6 @@ #include "selinux_internal.h" #include <stdlib.h> #include <errno.h> -#include <asm/page.h> #include "policy.h" int getprevcon_raw(security_context_t *context) @@ -18,7 +17,7 @@ if (fd < 0) return -1; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) { ret = -1; --- libselinux-1.30.orig/src/init.c +++ libselinux-1.30/src/init.c @@ -4,7 +4,6 @@ #include <stdlib.h> #include <errno.h> #include <ctype.h> -#include <asm/page.h> #include <stdio.h> #include <dlfcn.h> @@ -27,7 +26,7 @@ if (!fp) return; - size = PAGE_SIZE; + size = sysconf(_SC_PAGE_SIZE); buf = malloc(size); if (!buf) goto out;
signature.asc
Description: Digital signature