file permissions and client buffer overflow fix
[fwknop.git] / client / utils.c
1 /*
2  *****************************************************************************
3  *
4  * File:    utils.c
5  *
6  * Author:  Damien S. Stuart
7  *
8  * Purpose: General/Generic functions for the fwknop client.
9  *
10  * Copyright 2009-2010 Damien Stuart (dstuart@dstuart.org)
11  *
12  *  License (GNU Public License):
13  *
14  *  This program is free software; you can redistribute it and/or
15  *  modify it under the terms of the GNU General Public License
16  *  as published by the Free Software Foundation; either version 2
17  *  of the License, or (at your option) any later version.
18  *
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
27  *  USA
28  *
29  *****************************************************************************
30 */
31 #include "utils.h"
32
33 /* Generic hex dump function.
34 */
35 void
36 hex_dump(const unsigned char *data, const int size)
37 {
38     int ln, i, j = 0;
39     char ascii_str[17] = {0};
40
41     for(i=0; i<size; i++)
42     {
43         if((i % 16) == 0)
44         {
45             printf(" %s\n  0x%.4x:  ", ascii_str, i);
46             memset(ascii_str, 0x0, 17);
47             j = 0;
48         }
49
50         printf("%.2x ", data[i]);
51
52         ascii_str[j++] = (data[i] < 0x20 || data[i] > 0x7e) ? '.' : data[i];
53
54         if(j == 8)
55             printf(" ");
56     }
57
58     /* Remainder...
59     */
60     ln = strlen(ascii_str);
61     if(ln > 0)
62     {
63         for(i=0; i < 16-ln; i++)
64             printf("   ");
65
66         printf(" %s\n\n", ascii_str);
67     }
68 }
69
70 int
71 set_file_perms(const char *file)
72 {
73     int res = 0;
74
75     res = chmod(file, S_IRUSR | S_IWUSR);
76
77     if(res != 0)
78     {
79         fprintf(stderr,
80             "[-] unable to chmod file %s to user read/write (0600, -rw-------): %s\n",
81             file,
82             strerror(errno)
83         );
84     }
85     return res;
86 }
87
88 int
89 verify_file_perms_ownership(const char *file)
90 {
91 #if HAVE_STAT
92     struct stat st;
93
94     /* Every file that the fwknop client deals with should be owned
95      * by the user and permissions set to 600 (user read/write)
96     */
97     if((stat(file, &st)) != 0)
98     {
99         fprintf(stderr, "[-] unable to run stat() against file: %s: %s\n",
100             file, strerror(errno));
101         exit(EXIT_FAILURE);
102     }
103
104     /* Make sure it is a regular file or symbolic link
105     */
106     if(S_ISREG(st.st_mode) != 1 && S_ISLNK(st.st_mode) != 1)
107     {
108         fprintf(stderr,
109             "[-] file: %s is not a regular file or symbolic link.\n",
110             file
111         );
112         return 0;
113     }
114
115     if((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR))
116     {
117         fprintf(stderr,
118             "[-] file: %s permissions should only be user read/write (0600, -rw-------)\n",
119             file
120         );
121         return 0;
122     }
123
124     if(st.st_uid != getuid())
125     {
126         fprintf(stderr, "[-] file: %s not owned by current effective user id.\n",
127             file);
128         return 0;
129     }
130 #endif
131
132     return 1;
133 }
134
135 /***EOF***/