diff options
Diffstat (limited to 'security/selinux/ss/mls.c')
| -rw-r--r-- | security/selinux/ss/mls.c | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c index 756036bcc243..d4c32c39ccc9 100644 --- a/security/selinux/ss/mls.c +++ b/security/selinux/ss/mls.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
| 17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
| 18 | #include "sidtab.h" | ||
| 18 | #include "mls.h" | 19 | #include "mls.h" |
| 19 | #include "policydb.h" | 20 | #include "policydb.h" |
| 20 | #include "services.h" | 21 | #include "services.h" |
| @@ -208,6 +209,26 @@ int mls_context_isvalid(struct policydb *p, struct context *c) | |||
| 208 | } | 209 | } |
| 209 | 210 | ||
| 210 | /* | 211 | /* |
| 212 | * Copies the MLS range from `src' into `dst'. | ||
| 213 | */ | ||
| 214 | static inline int mls_copy_context(struct context *dst, | ||
| 215 | struct context *src) | ||
| 216 | { | ||
| 217 | int l, rc = 0; | ||
| 218 | |||
| 219 | /* Copy the MLS range from the source context */ | ||
| 220 | for (l = 0; l < 2; l++) { | ||
| 221 | dst->range.level[l].sens = src->range.level[l].sens; | ||
| 222 | rc = ebitmap_cpy(&dst->range.level[l].cat, | ||
| 223 | &src->range.level[l].cat); | ||
| 224 | if (rc) | ||
| 225 | break; | ||
| 226 | } | ||
| 227 | |||
| 228 | return rc; | ||
| 229 | } | ||
| 230 | |||
| 231 | /* | ||
| 211 | * Set the MLS fields in the security context structure | 232 | * Set the MLS fields in the security context structure |
| 212 | * `context' based on the string representation in | 233 | * `context' based on the string representation in |
| 213 | * the string `*scontext'. Update `*scontext' to | 234 | * the string `*scontext'. Update `*scontext' to |
| @@ -216,10 +237,20 @@ int mls_context_isvalid(struct policydb *p, struct context *c) | |||
| 216 | * | 237 | * |
| 217 | * This function modifies the string in place, inserting | 238 | * This function modifies the string in place, inserting |
| 218 | * NULL characters to terminate the MLS fields. | 239 | * NULL characters to terminate the MLS fields. |
| 240 | * | ||
| 241 | * If a def_sid is provided and no MLS field is present, | ||
| 242 | * copy the MLS field of the associated default context. | ||
| 243 | * Used for upgraded to MLS systems where objects may lack | ||
| 244 | * MLS fields. | ||
| 245 | * | ||
| 246 | * Policy read-lock must be held for sidtab lookup. | ||
| 247 | * | ||
| 219 | */ | 248 | */ |
| 220 | int mls_context_to_sid(char oldc, | 249 | int mls_context_to_sid(char oldc, |
| 221 | char **scontext, | 250 | char **scontext, |
| 222 | struct context *context) | 251 | struct context *context, |
| 252 | struct sidtab *s, | ||
| 253 | u32 def_sid) | ||
| 223 | { | 254 | { |
| 224 | 255 | ||
| 225 | char delim; | 256 | char delim; |
| @@ -231,9 +262,23 @@ int mls_context_to_sid(char oldc, | |||
| 231 | if (!selinux_mls_enabled) | 262 | if (!selinux_mls_enabled) |
| 232 | return 0; | 263 | return 0; |
| 233 | 264 | ||
| 234 | /* No MLS component to the security context. */ | 265 | /* |
| 235 | if (!oldc) | 266 | * No MLS component to the security context, try and map to |
| 267 | * default if provided. | ||
| 268 | */ | ||
| 269 | if (!oldc) { | ||
| 270 | struct context *defcon; | ||
| 271 | |||
| 272 | if (def_sid == SECSID_NULL) | ||
| 273 | goto out; | ||
| 274 | |||
| 275 | defcon = sidtab_search(s, def_sid); | ||
| 276 | if (!defcon) | ||
| 277 | goto out; | ||
| 278 | |||
| 279 | rc = mls_copy_context(context, defcon); | ||
| 236 | goto out; | 280 | goto out; |
| 281 | } | ||
| 237 | 282 | ||
| 238 | /* Extract low sensitivity. */ | 283 | /* Extract low sensitivity. */ |
| 239 | scontextp = p = *scontext; | 284 | scontextp = p = *scontext; |
| @@ -334,26 +379,6 @@ out: | |||
| 334 | } | 379 | } |
| 335 | 380 | ||
| 336 | /* | 381 | /* |
| 337 | * Copies the MLS range from `src' into `dst'. | ||
| 338 | */ | ||
| 339 | static inline int mls_copy_context(struct context *dst, | ||
| 340 | struct context *src) | ||
| 341 | { | ||
| 342 | int l, rc = 0; | ||
| 343 | |||
| 344 | /* Copy the MLS range from the source context */ | ||
| 345 | for (l = 0; l < 2; l++) { | ||
| 346 | dst->range.level[l].sens = src->range.level[l].sens; | ||
| 347 | rc = ebitmap_cpy(&dst->range.level[l].cat, | ||
| 348 | &src->range.level[l].cat); | ||
| 349 | if (rc) | ||
| 350 | break; | ||
| 351 | } | ||
| 352 | |||
| 353 | return rc; | ||
| 354 | } | ||
| 355 | |||
| 356 | /* | ||
| 357 | * Copies the effective MLS range from `src' into `dst'. | 382 | * Copies the effective MLS range from `src' into `dst'. |
| 358 | */ | 383 | */ |
| 359 | static inline int mls_scopy_context(struct context *dst, | 384 | static inline int mls_scopy_context(struct context *dst, |
