Branch data Line data Source code
1 : : /**
2 : : * \file server/utils.c
3 : : *
4 : : * \brief General/Generic functions for the fwknop server.
5 : : */
6 : :
7 : : /* Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
8 : : * Copyright (C) 2009-2015 fwknop developers and contributors. For a full
9 : : * list of contributors, see the file 'CREDITS'.
10 : : *
11 : : * License (GNU General Public License):
12 : : *
13 : : * This program is free software; you can redistribute it and/or
14 : : * modify it under the terms of the GNU General Public License
15 : : * as published by the Free Software Foundation; either version 2
16 : : * of the License, or (at your option) any later version.
17 : : *
18 : : * This program is distributed in the hope that it will be useful,
19 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 : : * GNU General Public License for more details.
22 : : *
23 : : * You should have received a copy of the GNU General Public License
24 : : * along with this program; if not, write to the Free Software
25 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26 : : * USA
27 : : */
28 : :
29 : : #include "fwknopd_common.h"
30 : : #include "utils.h"
31 : : #include "log_msg.h"
32 : : #include "replay_cache.h"
33 : : #include "config_init.h"
34 : : #include "fw_util.h"
35 : : #include "cmd_cycle.h"
36 : :
37 : : /* Basic directory/binary checks (stat() and whether the path is actually
38 : : * a directory or an executable).
39 : : */
40 : : static int
41 : 7244 : is_valid_path(const char *path, const int file_type)
42 : : {
43 [ + + ]: 7244 : if(strnlen(path, MAX_PATH_LEN) == MAX_PATH_LEN)
44 : : {
45 : 2 : log_msg(LOG_ERR, "[-] Provided path is too long");
46 : 2 : return(0);
47 : : }
48 : :
49 : : #if HAVE_STAT || HAVE_LSTAT
50 : : struct stat st;
51 : :
52 : : /* If we are unable to stat the given path, then return with error.
53 : : */
54 : : #if HAVE_LSTAT /* prefer lstat() to stat() */
55 [ + + ]: 7242 : if(lstat(path, &st) != 0)
56 : : {
57 : 8 : log_msg(LOG_ERR, "[-] unable to lstat() path: %s: %s",
58 : 8 : path, strerror(errno));
59 : 8 : return(0);
60 : : }
61 : : #else
62 : : if(stat(path, &st) != 0)
63 : : {
64 : : log_msg(LOG_ERR, "[-] unable to stat() path: %s: %s",
65 : : path, strerror(errno));
66 : : return(0);
67 : : }
68 : : #endif
69 : :
70 [ + + ]: 7234 : if(file_type == IS_DIR)
71 : : {
72 [ + + ]: 79 : if(!S_ISDIR(st.st_mode))
73 : : return(0);
74 : : }
75 [ + + ]: 7155 : else if(file_type == IS_EXE)
76 : : {
77 [ + + ]: 10 : if(!S_ISREG(st.st_mode) || ! (st.st_mode & S_IXUSR))
78 : : return(0);
79 : : }
80 [ + - ]: 7145 : else if(file_type == IS_FILE)
81 : : {
82 [ + - ]: 7145 : if(!S_ISREG(st.st_mode))
83 : : return(0);
84 : : }
85 : : else
86 : : return(0);
87 : :
88 : : #endif /* HAVE_STAT || HAVE_LSTAT */
89 : :
90 : 7232 : return(1);
91 : : }
92 : :
93 : : int
94 : 86 : is_valid_dir(const char *path)
95 : : {
96 : 86 : return is_valid_path(path, IS_DIR);
97 : : }
98 : :
99 : : int
100 : 12 : is_valid_exe(const char *path)
101 : : {
102 : 12 : return is_valid_path(path, IS_EXE);
103 : : }
104 : :
105 : : int
106 : 7146 : is_valid_file(const char *path)
107 : : {
108 : 7146 : return is_valid_path(path, IS_FILE);
109 : : }
110 : :
111 : : int
112 : 17294 : verify_file_perms_ownership(const char *file)
113 : : {
114 : : #if HAVE_STAT
115 : : struct stat st;
116 : :
117 : : /* Every file that fwknopd deals with should be owned
118 : : * by the user and permissions set to 600 (user read/write)
119 : : */
120 [ + - ]: 17294 : if((stat(file, &st)) == 0)
121 : : {
122 : : /* Make sure it is a regular file
123 : : */
124 [ + + ]: 17294 : if(S_ISREG(st.st_mode) != 1 && S_ISLNK(st.st_mode) != 1)
125 : : {
126 : 1 : log_msg(LOG_WARNING,
127 : : "[-] file: %s is not a regular file or symbolic link.",
128 : : file
129 : : );
130 : 1 : return 0;
131 : : }
132 : :
133 [ + + ]: 17293 : if((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR))
134 : : {
135 : 390 : log_msg(LOG_WARNING,
136 : : "[-] file: %s permissions should only be user read/write (0600, -rw-------)",
137 : : file
138 : : );
139 : : /* when we start in enforcing this instead of just warning
140 : : * the user
141 : : res = 0;
142 : : */
143 : : }
144 : :
145 [ + + ]: 17293 : if(st.st_uid != getuid())
146 : : {
147 : 15037 : log_msg(LOG_WARNING, "[-] file: %s not owned by current effective user id",
148 : : file);
149 : : /* when we start in enforcing this instead of just warning
150 : : * the user
151 : : res = 0;
152 : : */
153 : : }
154 : : }
155 : : else
156 : : {
157 : : /* if the path doesn't exist, just return, but otherwise something
158 : : * went wrong
159 : : */
160 [ # # ]: 0 : if(errno != ENOENT)
161 : : {
162 : 0 : log_msg(LOG_ERR, "[-] stat() against file: %s returned: %s",
163 : : file, strerror(errno));
164 : 0 : return 0;
165 : : }
166 : : }
167 : :
168 : : #endif
169 : :
170 : : return 1;
171 : : }
172 : :
173 : : void
174 : 15751 : truncate_partial_line(char *str)
175 : : {
176 : 15751 : int i, have_newline=0;
177 : :
178 [ + + ][ + + ]: 15751 : if(str != NULL && str[0] != 0x0)
179 : : {
180 [ + + ]: 773181 : for (i=0; i < strlen(str); i++)
181 : : {
182 [ + + ]: 773168 : if(str[i] == 0x0a)
183 : : {
184 : : have_newline = 1;
185 : : break;
186 : : }
187 : : }
188 : :
189 : : /* Don't zero out any data unless there is at least
190 : : * one newline
191 : : */
192 [ + + ]: 14789 : if(have_newline)
193 : : {
194 [ + - ]: 16014 : for (i=strlen(str)-1; i > 0; i--)
195 : : {
196 [ + + ]: 16014 : if(str[i] == 0x0a)
197 : : break;
198 : 1238 : str[i] = 0x0;
199 : : }
200 : : }
201 : : }
202 : 15751 : return;
203 : : }
204 : :
205 : : /* Simple test to see if a string only contains digits
206 : : */
207 : : int
208 : 4164 : is_digits(const char * const str)
209 : : {
210 : : int i;
211 [ + - ][ + - ]: 4164 : if (str != NULL && str[0] != 0x0)
212 : : {
213 [ + + ]: 21501 : for (i=0; i<strlen(str); i++)
214 : : {
215 [ + + ]: 18033 : if(!isdigit(str[i]))
216 : : return 0;
217 : 17337 : i++;
218 : : }
219 : : }
220 : : return 1;
221 : : }
222 : :
223 : : void
224 : 7116 : clean_exit(fko_srv_options_t *opts, unsigned int fw_cleanup_flag, unsigned int exit_status)
225 : : {
226 : : #if HAVE_LIBFIU
227 [ + + ]: 7116 : if(opts->config[CONF_FAULT_INJECTION_TAG] != NULL)
228 : : {
229 : 36 : fiu_disable(opts->config[CONF_FAULT_INJECTION_TAG]);
230 : : }
231 : : #endif
232 : :
233 [ + + ][ + + ]: 7116 : if(!opts->test && opts->enable_fw && (fw_cleanup_flag == FW_CLEANUP))
[ + + ]
234 : 461 : fw_cleanup(opts);
235 : :
236 : : #if USE_FILE_CACHE
237 : 7115 : free_replay_list(opts);
238 : : #endif
239 : :
240 : 7115 : free_logging();
241 : 7115 : free_cmd_cycle_list(opts);
242 : 7115 : free_configs(opts);
243 : 7115 : exit(exit_status);
244 : : }
245 : :
246 : : /***EOF***/
|