@@ -510,6 +510,42 @@ int smk_netlbl_mls(int level, char *catset, struct netlbl_lsm_secattr *sap,
510510 return 0 ;
511511}
512512
513+ /**
514+ * smack_populate_secattr - fill in the smack_known netlabel information
515+ * @skp: pointer to the structure to fill
516+ *
517+ * Populate the netlabel secattr structure for a Smack label.
518+ *
519+ * Returns 0 unless creating the category mapping fails
520+ */
521+ int smack_populate_secattr (struct smack_known * skp )
522+ {
523+ int slen ;
524+
525+ skp -> smk_netlabel .attr .secid = skp -> smk_secid ;
526+ skp -> smk_netlabel .domain = skp -> smk_known ;
527+ skp -> smk_netlabel .cache = netlbl_secattr_cache_alloc (GFP_ATOMIC );
528+ if (skp -> smk_netlabel .cache != NULL ) {
529+ skp -> smk_netlabel .flags |= NETLBL_SECATTR_CACHE ;
530+ skp -> smk_netlabel .cache -> free = NULL ;
531+ skp -> smk_netlabel .cache -> data = skp ;
532+ }
533+ skp -> smk_netlabel .flags |= NETLBL_SECATTR_SECID |
534+ NETLBL_SECATTR_MLS_LVL |
535+ NETLBL_SECATTR_DOMAIN ;
536+ /*
537+ * If direct labeling works use it.
538+ * Otherwise use mapped labeling.
539+ */
540+ slen = strlen (skp -> smk_known );
541+ if (slen < SMK_CIPSOLEN )
542+ return smk_netlbl_mls (smack_cipso_direct , skp -> smk_known ,
543+ & skp -> smk_netlabel , slen );
544+
545+ return smk_netlbl_mls (smack_cipso_mapped , (char * )& skp -> smk_secid ,
546+ & skp -> smk_netlabel , sizeof (skp -> smk_secid ));
547+ }
548+
513549/**
514550 * smk_import_entry - import a label, return the list entry
515551 * @string: a text string that might be a Smack label
@@ -523,7 +559,6 @@ struct smack_known *smk_import_entry(const char *string, int len)
523559{
524560 struct smack_known * skp ;
525561 char * smack ;
526- int slen ;
527562 int rc ;
528563
529564 smack = smk_parse_smack (string , len );
@@ -544,21 +579,8 @@ struct smack_known *smk_import_entry(const char *string, int len)
544579
545580 skp -> smk_known = smack ;
546581 skp -> smk_secid = smack_next_secid ++ ;
547- skp -> smk_netlabel .domain = skp -> smk_known ;
548- skp -> smk_netlabel .flags =
549- NETLBL_SECATTR_DOMAIN | NETLBL_SECATTR_MLS_LVL ;
550- /*
551- * If direct labeling works use it.
552- * Otherwise use mapped labeling.
553- */
554- slen = strlen (smack );
555- if (slen < SMK_CIPSOLEN )
556- rc = smk_netlbl_mls (smack_cipso_direct , skp -> smk_known ,
557- & skp -> smk_netlabel , slen );
558- else
559- rc = smk_netlbl_mls (smack_cipso_mapped , (char * )& skp -> smk_secid ,
560- & skp -> smk_netlabel , sizeof (skp -> smk_secid ));
561582
583+ rc = smack_populate_secattr (skp );
562584 if (rc >= 0 ) {
563585 INIT_LIST_HEAD (& skp -> smk_rules );
564586 mutex_init (& skp -> smk_rules_lock );
@@ -569,9 +591,6 @@ struct smack_known *smk_import_entry(const char *string, int len)
569591 smk_insert_entry (skp );
570592 goto unlockout ;
571593 }
572- /*
573- * smk_netlbl_mls failed.
574- */
575594 kfree (skp );
576595 skp = ERR_PTR (rc );
577596freeout :
0 commit comments