summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_mac.c60
-rw-r--r--sys/security/mac/mac_framework.c60
-rw-r--r--sys/security/mac/mac_internal.h60
-rw-r--r--sys/security/mac/mac_net.c60
-rw-r--r--sys/security/mac/mac_pipe.c60
-rw-r--r--sys/security/mac/mac_policy.h19
-rw-r--r--sys/security/mac/mac_process.c60
-rw-r--r--sys/security/mac/mac_syscalls.c60
-rw-r--r--sys/security/mac/mac_system.c60
-rw-r--r--sys/security/mac/mac_vfs.c60
-rw-r--r--sys/security/mac_biba/mac_biba.c40
-rw-r--r--sys/security/mac_lomac/mac_lomac.c171
-rw-r--r--sys/security/mac_mls/mac_mls.c40
-rw-r--r--sys/security/mac_none/mac_none.c2
-rw-r--r--sys/security/mac_partition/mac_partition.c10
-rw-r--r--sys/security/mac_stub/mac_stub.c2
-rw-r--r--sys/security/mac_test/mac_test.c2
-rw-r--r--sys/sys/mac_policy.h19
18 files changed, 298 insertions, 547 deletions
diff --git a/sys/kern/kern_mac.c b/sys/kern/kern_mac.c
index 79a12ec..0d6bf29 100644
--- a/sys/kern/kern_mac.c
+++ b/sys/kern/kern_mac.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_framework.c b/sys/security/mac/mac_framework.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_framework.c
+++ b/sys/security/mac/mac_framework.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_internal.h b/sys/security/mac/mac_internal.h
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_internal.h
+++ b/sys/security/mac/mac_internal.h
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_net.c b/sys/security/mac/mac_net.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_net.c
+++ b/sys/security/mac/mac_net.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_pipe.c b/sys/security/mac/mac_pipe.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_pipe.c
+++ b/sys/security/mac/mac_pipe.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_policy.h b/sys/security/mac/mac_policy.h
index 878b961..b1f7a43 100644
--- a/sys/security/mac/mac_policy.h
+++ b/sys/security/mac/mac_policy.h
@@ -60,6 +60,7 @@ struct mac_policy_conf;
struct mbuf;
struct mount;
struct pipe;
+struct sbuf;
struct socket;
struct ucred;
struct uio;
@@ -114,23 +115,17 @@ struct mac_policy_ops {
void (*mpo_copy_vnode_label)(struct label *src,
struct label *dest);
int (*mpo_externalize_cred_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_ifnet_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_pipe_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_socket_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_socket_peer_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_vnode_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_internalize_cred_label)(struct label *label,
char *element_name, char *element_data, int *claimed);
int (*mpo_internalize_ifnet_label)(struct label *label,
diff --git a/sys/security/mac/mac_process.c b/sys/security/mac/mac_process.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_process.c
+++ b/sys/security/mac/mac_process.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_syscalls.c b/sys/security/mac/mac_syscalls.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_syscalls.c
+++ b/sys/security/mac/mac_syscalls.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_system.c b/sys/security/mac/mac_system.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_system.c
+++ b/sys/security/mac/mac_system.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac/mac_vfs.c b/sys/security/mac/mac_vfs.c
index 79a12ec..0d6bf29 100644
--- a/sys/security/mac/mac_vfs.c
+++ b/sys/security/mac/mac_vfs.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -398,65 +399,44 @@ mac_policy_list_unbusy(void)
#define MAC_EXTERNALIZE(type, label, elementlist, outbuf, \
outbuflen) do { \
- char *curptr, *curptr_start, *element_name, *element_temp; \
- size_t left, left_start, len; \
- int claimed, first, first_start, ignorenotfound; \
+ int claimed, first, ignorenotfound, savedlen; \
+ char *element_name, *element_temp; \
+ struct sbuf sb; \
\
error = 0; \
- element_temp = elementlist; \
- curptr = outbuf; \
- curptr[0] = '\0'; \
- left = outbuflen; \
first = 1; \
+ sbuf_new(&sb, outbuf, outbuflen, SBUF_FIXEDLEN); \
+ element_temp = elementlist; \
while ((element_name = strsep(&element_temp, ",")) != NULL) { \
- curptr_start = curptr; \
- left_start = left; \
- first_start = first; \
if (element_name[0] == '?') { \
element_name++; \
ignorenotfound = 1; \
- } else \
+ } else \
ignorenotfound = 0; \
- claimed = 0; \
+ savedlen = sbuf_len(&sb); \
if (first) { \
- len = snprintf(curptr, left, "%s/", \
- element_name); \
+ error = sbuf_printf(&sb, "%s/", element_name); \
first = 0; \
} else \
- len = snprintf(curptr, left, ",%s/", \
- element_name); \
- if (len >= left) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
+ error = sbuf_printf(&sb, ",%s/", element_name); \
+ if (error == -1) { \
+ error = EINVAL; /* XXX: E2BIG? */ \
break; \
} \
- curptr += len; \
- left -= len; \
- \
+ claimed = 0; \
MAC_CHECK(externalize_ ## type, label, element_name, \
- curptr, left, &len, &claimed); \
+ &sb, &claimed); \
if (error) \
break; \
- if (claimed == 1) { \
- if (len >= outbuflen) { \
- error = EINVAL; /* XXXMAC: E2BIG */ \
- break; \
- } \
- curptr += len; \
- left -= len; \
- } else if (claimed == 0 && ignorenotfound) { \
- /* \
- * Revert addition of the label element \
- * name. \
- */ \
- curptr = curptr_start; \
- *curptr = '\0'; \
- left = left_start; \
- first = first_start; \
- } else { \
- error = EINVAL; /* XXXMAC: ENOLABEL */ \
+ if (claimed == 0 && ignorenotfound) { \
+ /* Revert last label name. */ \
+ sbuf_setpos(&sb, savedlen); \
+ } else if (claimed != 1) { \
+ error = EINVAL; /* XXX: ENOLABEL? */ \
break; \
} \
} \
+ sbuf_finish(&sb); \
} while (0)
#define MAC_INTERNALIZE(type, label, instring) do { \
diff --git a/sys/security/mac_biba/mac_biba.c b/sys/security/mac_biba/mac_biba.c
index fa9d5e2..60575c0 100644
--- a/sys/security/mac_biba/mac_biba.c
+++ b/sys/security/mac_biba/mac_biba.c
@@ -576,57 +576,49 @@ mac_biba_element_to_string(struct sbuf *sb, struct mac_biba_element *element)
}
/*
- * mac_biba_to_string() converts an Biba label to a string, placing the
- * results in the passed string buffer. It returns 0 on success,
- * or EINVAL if there isn't room in the buffer. The size of the
- * string appended, leaving out the nul termination, is returned to
- * the caller via *caller_len. Eventually, we should expose the
- * sbuf to the caller rather than using C strings at this layer.
+ * mac_biba_to_string() converts a Biba label to a string, and places
+ * the results in the passed sbuf. It returns 0 on success, or EINVAL
+ * if there isn't room in the sbuf. Note: the sbuf will be modified
+ * even in a failure case, so the caller may need to revert the sbuf
+ * by restoring the offset if that's undesired.
*/
static int
-mac_biba_to_string(char *string, size_t size, size_t *caller_len,
- struct mac_biba *mac_biba)
+mac_biba_to_string(struct sbuf *sb, struct mac_biba *mac_biba)
{
- struct sbuf sb;
-
- sbuf_new(&sb, string, size, SBUF_FIXEDLEN);
if (mac_biba->mb_flags & MAC_BIBA_FLAG_SINGLE) {
- if (mac_biba_element_to_string(&sb, &mac_biba->mb_single)
+ if (mac_biba_element_to_string(sb, &mac_biba->mb_single)
== -1)
return (EINVAL);
}
if (mac_biba->mb_flags & MAC_BIBA_FLAG_RANGE) {
- if (sbuf_putc(&sb, '(') == -1)
+ if (sbuf_putc(sb, '(') == -1)
return (EINVAL);
- if (mac_biba_element_to_string(&sb, &mac_biba->mb_rangelow)
+ if (mac_biba_element_to_string(sb, &mac_biba->mb_rangelow)
== -1)
return (EINVAL);
- if (sbuf_putc(&sb, '-') == -1)
+ if (sbuf_putc(sb, '-') == -1)
return (EINVAL);
- if (mac_biba_element_to_string(&sb, &mac_biba->mb_rangehigh)
+ if (mac_biba_element_to_string(sb, &mac_biba->mb_rangehigh)
== -1)
return (EINVAL);
- if (sbuf_putc(&sb, ')') == -1)
+ if (sbuf_putc(sb, ')') == -1)
return (EINVAL);
}
- sbuf_finish(&sb);
- *caller_len = strlen(string);
return (0);
}
static int
mac_biba_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
struct mac_biba *mac_biba;
- int error;
if (strcmp(MAC_BIBA_LABEL_NAME, element_name) != 0)
return (0);
@@ -634,11 +626,7 @@ mac_biba_externalize_label(struct label *label, char *element_name,
(*claimed)++;
mac_biba = SLOT(label);
- error = mac_biba_to_string(element_data, size, len, mac_biba);
- if (error)
- return (error);
-
- return (0);
+ return (mac_biba_to_string(sb, mac_biba));
}
static int
diff --git a/sys/security/mac_lomac/mac_lomac.c b/sys/security/mac_lomac/mac_lomac.c
index 57c95e8..0f85c07 100644
--- a/sys/security/mac_lomac/mac_lomac.c
+++ b/sys/security/mac_lomac/mac_lomac.c
@@ -49,6 +49,7 @@
#include <sys/malloc.h>
#include <sys/mount.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -483,21 +484,23 @@ mac_lomac_copy(struct mac_lomac *source, struct mac_lomac *dest)
mac_lomac_copy_range(source, dest);
}
-static int mac_lomac_to_string(char *string, size_t size,
- size_t *caller_len, struct mac_lomac *mac_lomac);
+static int mac_lomac_to_string(struct sbuf *sb,
+ struct mac_lomac *mac_lomac);
static int
maybe_demote(struct mac_lomac *subjlabel, struct mac_lomac *objlabel,
const char *actionname, const char *objname, struct vnode *vpq)
{
+ struct sbuf subjlabel_sb, subjtext_sb, objlabel_sb;
+ char *subjlabeltext, *objlabeltext, *subjtext;
+ struct mac_lomac cached_subjlabel;
+ struct mac_lomac_proc *subj;
struct vattr va;
- static char xxx[] = "<<XXX>>";
- struct mac_lomac_proc *subj = PSLOT(&curthread->td_proc->p_label);
- char *subjlabeltext, *objlabeltext, *subjtext, *text;
struct proc *p;
- size_t len;
pid_t pgid;
+ subj = PSLOT(&curthread->td_proc->p_label);
+
p = curthread->td_proc;
mtx_lock(&subj->mtx);
if (subj->mac_lomac.ml_flags & MAC_LOMAC_FLAG_UPDATE) {
@@ -531,32 +534,29 @@ maybe_demote(struct mac_lomac *subjlabel, struct mac_lomac *objlabel,
curthread->td_flags |= TDF_ASTPENDING;
curthread->td_proc->p_sflag |= PS_MACPEND;
mtx_unlock_spin(&sched_lock);
- subjtext = subjlabeltext = objlabeltext = xxx;
- if (mac_lomac_to_string(NULL, 0, &len, &subj->mac_lomac) == 0 &&
- (text = malloc(len + 1, M_MACLOMAC, M_NOWAIT)) != NULL) {
- if (mac_lomac_to_string(text, len + 1, &len,
- &subj->mac_lomac) == 0)
- subjtext = text;
- else
- free(text, M_MACLOMAC);
- }
+
+ /*
+ * Avoid memory allocation while holding a mutex; cache the
+ * label.
+ */
+ mac_lomac_copy_single(&subj->mac_lomac, &cached_subjlabel);
mtx_unlock(&subj->mtx);
- if (mac_lomac_to_string(NULL, 0, &len, subjlabel) == 0 &&
- (text = malloc(len + 1, M_MACLOMAC, M_NOWAIT)) != NULL) {
- if (mac_lomac_to_string(text, len + 1, &len,
- subjlabel) == 0)
- subjlabeltext = text;
- else
- free(text, M_MACLOMAC);
- }
- if (mac_lomac_to_string(NULL, 0, &len, objlabel) == 0 &&
- (text = malloc(len + 1, M_MACLOMAC, M_NOWAIT)) != NULL) {
- if (mac_lomac_to_string(text, len + 1, &len,
- objlabel) == 0)
- objlabeltext = text;
- else
- free(text, M_MACLOMAC);
- }
+
+ sbuf_new(&subjlabel_sb, NULL, 0, SBUF_AUTOEXTEND);
+ mac_lomac_to_string(&subjlabel_sb, subjlabel);
+ sbuf_finish(&subjlabel_sb);
+ subjlabeltext = sbuf_data(&subjlabel_sb);
+
+ sbuf_new(&subjtext_sb, NULL, 0, SBUF_AUTOEXTEND);
+ mac_lomac_to_string(&subjtext_sb, &subj->mac_lomac);
+ sbuf_finish(&subjtext_sb);
+ subjtext = sbuf_data(&subjtext_sb);
+
+ sbuf_new(&objlabel_sb, NULL, 0, SBUF_AUTOEXTEND);
+ mac_lomac_to_string(&objlabel_sb, objlabel);
+ sbuf_finish(&objlabel_sb);
+ objlabeltext = sbuf_data(&objlabel_sb);
+
pgid = p->p_pgrp->pg_id; /* XXX could be stale? */
if (vpq != NULL && VOP_GETATTR(vpq, &va, curthread->td_ucred,
curthread) == 0) {
@@ -572,13 +572,11 @@ maybe_demote(struct mac_lomac *subjlabel, struct mac_lomac *objlabel,
subjlabeltext, p->p_pid, pgid, curthread->td_ucred->cr_uid,
p->p_comm, subjtext, actionname, objlabeltext, objname);
}
+
+ sbuf_delete(&subjlabel_sb);
+ sbuf_delete(&subjtext_sb);
+ sbuf_delete(&objlabel_sb);
- if (subjlabeltext != xxx)
- free(subjlabeltext, M_MACLOMAC);
- if (objlabeltext != xxx)
- free(objlabeltext, M_MACLOMAC);
- if (subjtext != xxx)
- free(subjtext, M_MACLOMAC);
return (0);
}
@@ -659,28 +657,22 @@ mac_lomac_destroy_proc_label(struct label *label)
PSLOT(label) = NULL;
}
-/*
- * mac_lomac_element_to_string() is basically an snprintf wrapper with
- * the same properties as snprintf(). It returns the length it would
- * have added to the string in the event the string is too short.
- */
-static size_t
-mac_lomac_element_to_string(char *string, size_t size,
- struct mac_lomac_element *element)
+static int
+mac_lomac_element_to_string(struct sbuf *sb, struct mac_lomac_element *element)
{
switch (element->mle_type) {
case MAC_LOMAC_TYPE_HIGH:
- return (snprintf(string, size, "high"));
+ return (sbuf_printf(sb, "high"));
case MAC_LOMAC_TYPE_LOW:
- return (snprintf(string, size, "low"));
+ return (sbuf_printf(sb, "low"));
case MAC_LOMAC_TYPE_EQUAL:
- return (snprintf(string, size, "equal"));
+ return (sbuf_printf(sb, "equal"));
case MAC_LOMAC_TYPE_GRADE:
- return (snprintf(string, size, "%d", element->mle_grade));
+ return (sbuf_printf(sb, "%d", element->mle_grade));
default:
panic("mac_lomac_element_to_string: invalid type (%d)",
@@ -689,81 +681,54 @@ mac_lomac_element_to_string(char *string, size_t size,
}
static int
-mac_lomac_to_string(char *string, size_t size, size_t *caller_len,
- struct mac_lomac *mac_lomac)
+mac_lomac_to_string(struct sbuf *sb, struct mac_lomac *mac_lomac)
{
- size_t left, len, curlen;
- char *curptr;
- /*
- * Also accept NULL string to allow for predetermination of total
- * string length.
- */
- if (string != NULL)
- bzero(string, size);
- else if (size != 0)
- return (EINVAL);
- curptr = string;
- left = size;
- curlen = 0;
-
-#define INCLEN(length, leftover) do { \
- if (string != NULL) { \
- if (length >= leftover) \
- return (EINVAL); \
- leftover -= length; \
- curptr += length; \
- } \
- curlen += length; \
-} while (0)
if (mac_lomac->ml_flags & MAC_LOMAC_FLAG_SINGLE) {
- len = mac_lomac_element_to_string(curptr, left,
- &mac_lomac->ml_single);
- INCLEN(len, left);
+ if (mac_lomac_element_to_string(sb, &mac_lomac->ml_single)
+ == -1)
+ return (EINVAL);
}
if (mac_lomac->ml_flags & MAC_LOMAC_FLAG_AUX) {
- len = snprintf(curptr, left, "[");
- INCLEN(len, left);
+ if (sbuf_putc(sb, '[') == -1)
+ return (EINVAL);
- len = mac_lomac_element_to_string(curptr, left,
- &mac_lomac->ml_auxsingle);
- INCLEN(len, left);
+ if (mac_lomac_element_to_string(sb, &mac_lomac->ml_auxsingle)
+ == -1)
+ return (EINVAL);
- len = snprintf(curptr, left, "]");
- INCLEN(len, left);
+ if (sbuf_putc(sb, ']') == -1)
+ return (EINVAL);
}
if (mac_lomac->ml_flags & MAC_LOMAC_FLAG_RANGE) {
- len = snprintf(curptr, left, "(");
- INCLEN(len, left);
+ if (sbuf_putc(sb, '(') == -1)
+ return (EINVAL);
- len = mac_lomac_element_to_string(curptr, left,
- &mac_lomac->ml_rangelow);
- INCLEN(len, left);
+ if (mac_lomac_element_to_string(sb, &mac_lomac->ml_rangelow)
+ == -1)
+ return (EINVAL);
- len = snprintf(curptr, left, "-");
- INCLEN(len, left);
+ if (sbuf_putc(sb, '-') == -1)
+ return (EINVAL);
- len = mac_lomac_element_to_string(curptr, left,
- &mac_lomac->ml_rangehigh);
- INCLEN(len, left);
+ if (mac_lomac_element_to_string(sb, &mac_lomac->ml_rangehigh)
+ == -1)
+ return (EINVAL);
- len = snprintf(curptr, left, ")");
- INCLEN(len, left);
+ if (sbuf_putc(sb, '-') == -1)
+ return (EINVAL);
}
-#undef INCLEN
- *caller_len = curlen;
return (0);
}
static int
mac_lomac_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
struct mac_lomac *mac_lomac;
- int error;
if (strcmp(MAC_LOMAC_LABEL_NAME, element_name) != 0)
return (0);
@@ -771,12 +736,8 @@ mac_lomac_externalize_label(struct label *label, char *element_name,
(*claimed)++;
mac_lomac = SLOT(label);
- error = mac_lomac_to_string(element_data, size, len, mac_lomac);
- if (error)
- return (error);
- *len = strlen(element_data);
- return (0);
+ return (mac_lomac_to_string(sb, mac_lomac));
}
static int
diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c
index 2ceae35..b5e321b 100644
--- a/sys/security/mac_mls/mac_mls.c
+++ b/sys/security/mac_mls/mac_mls.c
@@ -541,57 +541,49 @@ mac_mls_element_to_string(struct sbuf *sb, struct mac_mls_element *element)
}
/*
- * mac_mls_to_string() converts an MLS label to a string, placing the
- * results in the passed string buffer. It returns 0 on success,
- * or EINVAL if there isn't room in the buffer. The size of the
- * string appended, leaving out the nul termination, is returned to
- * the caller via *caller_len. Eventually, we should expose the
- * sbuf to the caller rather than using C strings at this layer.
+ * mac_mls_to_string() converts an MLS label to a string, and places
+ * the results in the passed sbuf. It returns 0 on success, or EINVAL
+ * if there isn't room in the sbuf. Note: the sbuf will be modified
+ * even in a failure case, so the caller may need to revert the sbuf
+ * by restoring the offset if that's undesired.
*/
static int
-mac_mls_to_string(char *string, size_t size, size_t *caller_len,
- struct mac_mls *mac_mls)
+mac_mls_to_string(struct sbuf *sb, struct mac_mls *mac_mls)
{
- struct sbuf sb;
-
- sbuf_new(&sb, string, size, SBUF_FIXEDLEN);
if (mac_mls->mm_flags & MAC_MLS_FLAG_SINGLE) {
- if (mac_mls_element_to_string(&sb, &mac_mls->mm_single)
+ if (mac_mls_element_to_string(sb, &mac_mls->mm_single)
== -1)
return (EINVAL);
}
if (mac_mls->mm_flags & MAC_MLS_FLAG_RANGE) {
- if (sbuf_putc(&sb, '(') == -1)
+ if (sbuf_putc(sb, '(') == -1)
return (EINVAL);
- if (mac_mls_element_to_string(&sb, &mac_mls->mm_rangelow)
+ if (mac_mls_element_to_string(sb, &mac_mls->mm_rangelow)
== -1)
return (EINVAL);
- if (sbuf_putc(&sb, '-') == -1)
+ if (sbuf_putc(sb, '-') == -1)
return (EINVAL);
- if (mac_mls_element_to_string(&sb, &mac_mls->mm_rangehigh)
+ if (mac_mls_element_to_string(sb, &mac_mls->mm_rangehigh)
== -1)
return (EINVAL);
- if (sbuf_putc(&sb, ')') == -1)
+ if (sbuf_putc(sb, ')') == -1)
return (EINVAL);
}
- sbuf_finish(&sb);
- *caller_len = strlen(string);
return (0);
}
static int
mac_mls_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
struct mac_mls *mac_mls;
- int error;
if (strcmp(MAC_MLS_LABEL_NAME, element_name) != 0)
return (0);
@@ -600,11 +592,7 @@ mac_mls_externalize_label(struct label *label, char *element_name,
mac_mls = SLOT(label);
- error = mac_mls_to_string(element_data, size, len, mac_mls);
- if (error)
- return (error);
-
- return (0);
+ return (mac_mls_to_string(sb, mac_mls));
}
static int
diff --git a/sys/security/mac_none/mac_none.c b/sys/security/mac_none/mac_none.c
index 5a600ea..c2ce7e7 100644
--- a/sys/security/mac_none/mac_none.c
+++ b/sys/security/mac_none/mac_none.c
@@ -127,7 +127,7 @@ mac_none_destroy_label(struct label *label)
static int
mac_none_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
return (0);
diff --git a/sys/security/mac_partition/mac_partition.c b/sys/security/mac_partition/mac_partition.c
index 5c68399..ed5bc2e 100644
--- a/sys/security/mac_partition/mac_partition.c
+++ b/sys/security/mac_partition/mac_partition.c
@@ -46,6 +46,7 @@
#include <sys/mac.h>
#include <sys/mount.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
@@ -102,15 +103,18 @@ mac_partition_destroy_label(struct label *label)
static int
mac_partition_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
if (strcmp(MAC_PARTITION_LABEL_NAME, element_name) != 0)
return (0);
(*claimed)++;
- *len = snprintf(element_data, size, "%ld", SLOT(label));
- return (0);
+
+ if (sbuf_printf(sb, "%ld", SLOT(label)) == -1)
+ return (EINVAL);
+ else
+ return (0);
}
static int
diff --git a/sys/security/mac_stub/mac_stub.c b/sys/security/mac_stub/mac_stub.c
index 5a600ea..c2ce7e7 100644
--- a/sys/security/mac_stub/mac_stub.c
+++ b/sys/security/mac_stub/mac_stub.c
@@ -127,7 +127,7 @@ mac_none_destroy_label(struct label *label)
static int
mac_none_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
return (0);
diff --git a/sys/security/mac_test/mac_test.c b/sys/security/mac_test/mac_test.c
index 2b13379..7948646 100644
--- a/sys/security/mac_test/mac_test.c
+++ b/sys/security/mac_test/mac_test.c
@@ -531,7 +531,7 @@ mac_test_destroy_vnode_label(struct label *label)
static int
mac_test_externalize_label(struct label *label, char *element_name,
- char *element_data, size_t size, size_t *len, int *claimed)
+ struct sbuf *sb, int *claimed)
{
atomic_add_int(&externalize_count, 1);
diff --git a/sys/sys/mac_policy.h b/sys/sys/mac_policy.h
index 878b961..b1f7a43 100644
--- a/sys/sys/mac_policy.h
+++ b/sys/sys/mac_policy.h
@@ -60,6 +60,7 @@ struct mac_policy_conf;
struct mbuf;
struct mount;
struct pipe;
+struct sbuf;
struct socket;
struct ucred;
struct uio;
@@ -114,23 +115,17 @@ struct mac_policy_ops {
void (*mpo_copy_vnode_label)(struct label *src,
struct label *dest);
int (*mpo_externalize_cred_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_ifnet_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_pipe_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_socket_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_socket_peer_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_externalize_vnode_label)(struct label *label,
- char *element_name, char *buffer, size_t buflen,
- size_t *len, int *claimed);
+ char *element_name, struct sbuf *sb, int *claimed);
int (*mpo_internalize_cred_label)(struct label *label,
char *element_name, char *element_data, int *claimed);
int (*mpo_internalize_ifnet_label)(struct label *label,
OpenPOWER on IntegriCloud