1 /* 2 * Copyright (C) 2007 Casey Schaufler <casey (at) schaufler-ca.com> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, version 2. 7 * 8 * Author: 9 * Casey Schaufler <casey (at) schaufler-ca.com> 10 */ 11 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <string.h> 15 #include <unistd.h> 16 17 #include <sys/types.h> 18 #include <sys/stat.h> 19 #include <fcntl.h> 20 21 #include <sys/socket.h> 22 #include <netinet/in.h> 23 #include <arpa/inet.h> 24 #include <netinet/ip.h> 25 #include <netinet/udp.h> 26 #ifdef HAVE_LINUX_NETLINK_H 27 #include <linux/netlink.h> 28 #endif 29 30 #include <sys/xattr.h> 31 #include <sys/vfs.h> 32 33 #include "test.h" 34 35 char *TCID = "smack_set_socket_labels"; 36 int TST_TOTAL = 1; 37 38 static void setup(void); 39 static void cleanup(void); 40 static void set_socket_labels(char **); 41 42 int main(int argc, char *argv[]) 43 { 44 int lc; 45 46 tst_parse_opts(argc, argv, NULL, NULL); 47 48 setup(); 49 50 for (lc = 0; TEST_LOOPING(lc); lc++) { 51 tst_count = 0; 52 set_socket_labels(argv); 53 } 54 55 cleanup(); 56 tst_exit(); 57 } 58 59 static void setup(void) 60 { 61 tst_sig(NOFORK, DEF_HANDLER, cleanup); 62 63 TEST_PAUSE; 64 } 65 66 static void set_socket_labels(char **argv) 67 { 68 char *anin = "security.SMACK64IPIN"; 69 char *anout = "security.SMACK64IPOUT"; 70 char *annot = "security.SMACK64IPNOT"; 71 char *avin = "TheOne"; 72 char *avout = "TheOther"; 73 char *avnot = "TheBadValue"; 74 int sock; 75 int rc; 76 char buf[256]; 77 78 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 79 if (sock < 0) 80 tst_brkm(TFAIL, NULL, "%s Socket creation failure", argv[0]); 81 82 flistxattr(sock, buf, 256); 83 if (strstr(buf, "security.SMACK64") == NULL) 84 tst_brkm(TCONF, NULL, "smackfs not set."); 85 86 rc = fsetxattr(sock, anin, avin, strlen(avin) + 1, 0); 87 if (rc < 0) { 88 tst_brkm(TFAIL, NULL, "%s fsetxattr of %s to %s failure", 89 argv[0], anin, avin); 90 } 91 92 rc = fsetxattr(sock, anout, avout, strlen(avout) + 1, 0); 93 if (rc < 0) { 94 tst_brkm(TFAIL, NULL, "%s fsetxattr of %s to %s failure", 95 argv[0], anout, avout); 96 } 97 98 rc = fsetxattr(sock, annot, avnot, strlen(avnot) + 1, 0); 99 if (rc >= 0) { 100 tst_brkm(TFAIL, NULL, 101 "%s fsetxattr of %s to %s succeeded in error", 102 argv[0], anout, avout); 103 } 104 105 tst_resm(TPASS, "Test %s success.", TCID); 106 } 107 108 static void cleanup(void) 109 { 110 } 111