File: | gsyncd.c |
Location: | line 402, column 17 |
Description: | Potential leak of memory pointed to by 'argv' |
1 | /* | |||
2 | Copyright (c) 2011-2012 Red Hat, Inc. <http://www.redhat.com> | |||
3 | This file is part of GlusterFS. | |||
4 | ||||
5 | This file is licensed to you under your choice of the GNU Lesser | |||
6 | General Public License, version 3 or any later version (LGPLv3 or | |||
7 | later), or the GNU General Public License, version 2 (GPLv2), in all | |||
8 | cases as published by the Free Software Foundation. | |||
9 | */ | |||
10 | ||||
11 | #ifndef _CONFIG_H | |||
12 | #define _CONFIG_H | |||
13 | #include "config.h" | |||
14 | #endif | |||
15 | ||||
16 | #include <stdlib.h> | |||
17 | #include <stdio.h> | |||
18 | #include <unistd.h> | |||
19 | #include <string.h> | |||
20 | #include <sys/param.h> /* for PATH_MAX */ | |||
21 | ||||
22 | /* NOTE (USE_LIBGLUSTERFS): | |||
23 | * ------------------------ | |||
24 | * When USE_LIBGLUSTERFS debugging sumbol is passed; perform | |||
25 | * glusterfs translator like initialization so that glusterfs | |||
26 | * globals, contexts are valid when glustefs api's are invoked. | |||
27 | * We unconditionally pass then while building gsyncd binary. | |||
28 | */ | |||
29 | #ifdef USE_LIBGLUSTERFS1 | |||
30 | #include "glusterfs.h" | |||
31 | #include "globals.h" | |||
32 | #include "defaults.h" | |||
33 | #endif | |||
34 | ||||
35 | #include "common-utils.h" | |||
36 | #include "run.h" | |||
37 | #include "procdiggy.h" | |||
38 | ||||
39 | #define _GLUSTERD_CALLED_"_GLUSTERD_CALLED_" "_GLUSTERD_CALLED_" | |||
40 | #define _GSYNCD_DISPATCHED_"_GSYNCD_DISPATCHED_" "_GSYNCD_DISPATCHED_" | |||
41 | #define GSYNCD_CONF_TEMPLATE"geo-replication/gsyncd_template.conf" "geo-replication/gsyncd_template.conf" | |||
42 | #define GSYNCD_PY"gsyncd.py" "gsyncd.py" | |||
43 | #define RSYNC"rsync" "rsync" | |||
44 | ||||
45 | int restricted = 0; | |||
46 | ||||
47 | static int | |||
48 | duplexpand (void **buf, size_t tsiz, size_t *len) | |||
49 | { | |||
50 | size_t osiz = tsiz * *len; | |||
51 | char *p = realloc (*buf, osiz << 1); | |||
52 | if (!p) { | |||
53 | free(*buf); | |||
54 | return -1; | |||
55 | } | |||
56 | ||||
57 | memset (p + osiz, 0, osiz); | |||
58 | *buf = p; | |||
59 | *len <<= 1; | |||
60 | ||||
61 | return 0; | |||
62 | } | |||
63 | ||||
64 | static int | |||
65 | str2argv (char *str, char ***argv) | |||
66 | { | |||
67 | char *p = NULL((void*)0); | |||
68 | char *savetok = NULL((void*)0); | |||
69 | int argc = 0; | |||
70 | size_t argv_len = 32; | |||
71 | int ret = 0; | |||
72 | ||||
73 | assert (str)((str) ? (void) (0) : __assert_fail ("str", "gsyncd.c", 73, __PRETTY_FUNCTION__ )); | |||
74 | str = strdup (str)(__extension__ (__builtin_constant_p (str) && ((size_t )(const void *)((str) + 1) - (size_t)(const void *)(str) == 1 ) ? (((const char *) (str))[0] == '\0' ? (char *) calloc ((size_t ) 1, (size_t) 1) : ({ size_t __len = strlen (str) + 1; char * __retval = (char *) malloc (__len); if (__retval != ((void*)0 )) __retval = (char *) memcpy (__retval, str, __len); __retval ; })) : __strdup (str))); | |||
75 | if (!str) | |||
76 | return -1; | |||
77 | ||||
78 | *argv = calloc (argv_len, sizeof (**argv)); | |||
79 | if (!*argv) | |||
80 | goto error; | |||
81 | ||||
82 | while ((p = strtok_r (str, " ", &savetok)(__extension__ (__builtin_constant_p (" ") && ((size_t )(const void *)((" ") + 1) - (size_t)(const void *)(" ") == 1 ) && ((const char *) (" "))[0] != '\0' && ((const char *) (" "))[1] == '\0' ? __strtok_r_1c (str, ((const char *) (" "))[0], &savetok) : __strtok_r (str, " ", &savetok ))))) { | |||
83 | str = NULL((void*)0); | |||
84 | ||||
85 | argc++; | |||
86 | if (argc == argv_len) { | |||
87 | ret = duplexpand ((void *)argv, | |||
88 | sizeof (**argv), | |||
89 | &argv_len); | |||
90 | if (ret == -1) | |||
91 | goto error; | |||
92 | } | |||
93 | (*argv)[argc - 1] = p; | |||
94 | } | |||
95 | ||||
96 | return argc; | |||
97 | ||||
98 | error: | |||
99 | fprintf (stderrstderr, "out of memory\n"); | |||
100 | return -1; | |||
101 | } | |||
102 | ||||
103 | static int | |||
104 | invoke_gsyncd (int argc, char **argv) | |||
105 | { | |||
106 | char config_file[PATH_MAX4096] = {0,}; | |||
107 | size_t gluster_workdir_len = 0; | |||
108 | runner_t runner = {0,}; | |||
109 | int i = 0; | |||
110 | int j = 0; | |||
111 | char *nargv[argc + 4]; | |||
112 | char *python = NULL((void*)0); | |||
113 | ||||
114 | if (restricted) { | |||
115 | size_t len; | |||
116 | /* in restricted mode we forcibly use the system-wide config */ | |||
117 | runinit (&runner); | |||
118 | runner_add_args (&runner, SBIN_DIR"/usr/local/sbin""/gluster", | |||
119 | "--remote-host=localhost", | |||
120 | "--log-file=-", "system::", "getwd", | |||
121 | NULL((void*)0)); | |||
122 | runner_redir (&runner, STDOUT_FILENO1, RUN_PIPE-1); | |||
123 | if (runner_start (&runner) == 0 && | |||
124 | fgets (config_file, PATH_MAX4096, | |||
125 | runner_chio (&runner, STDOUT_FILENO1)) != NULL((void*)0) && | |||
126 | (len = strlen (config_file)) && | |||
127 | config_file[len - 1] == '\n' && | |||
128 | runner_end (&runner) == 0) | |||
129 | gluster_workdir_len = len - 1; | |||
130 | ||||
131 | if (gluster_workdir_len) { | |||
132 | if (gluster_workdir_len + 1 + strlen (GSYNCD_CONF_TEMPLATE"geo-replication/gsyncd_template.conf") + 1 > | |||
133 | PATH_MAX4096) | |||
134 | goto error; | |||
135 | config_file[gluster_workdir_len] = '/'; | |||
136 | strcat (config_file, GSYNCD_CONF_TEMPLATE"geo-replication/gsyncd_template.conf"); | |||
137 | } else | |||
138 | goto error; | |||
139 | ||||
140 | if (setenv ("_GSYNCD_RESTRICTED_", "1", 1) == -1) | |||
141 | goto error; | |||
142 | } | |||
143 | ||||
144 | if (chdir ("/") == -1) | |||
145 | goto error; | |||
146 | ||||
147 | j = 0; | |||
148 | python = getenv("PYTHON"); | |||
149 | if(!python) | |||
150 | python = PYTHON"/usr/bin/python"; | |||
151 | nargv[j++] = python; | |||
152 | nargv[j++] = GSYNCD_PREFIX"/usr/local/libexec/glusterfs""/python/syncdaemon/"GSYNCD_PY"gsyncd.py"; | |||
153 | for (i = 1; i < argc; i++) | |||
154 | nargv[j++] = argv[i]; | |||
155 | if (config_file[0]) { | |||
156 | nargv[j++] = "-c"; | |||
157 | nargv[j++] = config_file; | |||
158 | } | |||
159 | nargv[j++] = NULL((void*)0); | |||
160 | ||||
161 | execvp (python, nargv); | |||
162 | ||||
163 | fprintf (stderrstderr, "exec of '%s' failed\n", python); | |||
164 | return 127; | |||
165 | ||||
166 | error: | |||
167 | fprintf (stderrstderr, "gsyncd initializaion failed\n"); | |||
168 | return 1; | |||
169 | } | |||
170 | ||||
171 | ||||
172 | static int | |||
173 | find_gsyncd (pid_t pid, pid_t ppid, char *name, void *data) | |||
174 | { | |||
175 | char buf[NAME_MAX255 * 2] = {0,}; | |||
176 | char path[PATH_MAX4096] = {0,}; | |||
177 | char *p = NULL((void*)0); | |||
178 | int zeros = 0; | |||
179 | int ret = 0; | |||
180 | int fd = -1; | |||
181 | pid_t *pida = (pid_t *)data; | |||
182 | ||||
183 | if (ppid != pida[0]) | |||
184 | return 0; | |||
185 | ||||
186 | sprintf (path, PROC"/proc""/%d/cmdline", pid); | |||
187 | fd = open (path, O_RDONLY00); | |||
188 | if (fd == -1) | |||
189 | return 0; | |||
190 | ret = read (fd, buf, sizeof (buf)); | |||
191 | close (fd); | |||
192 | if (ret == -1) | |||
193 | return 0; | |||
194 | for (zeros = 0, p = buf; zeros < 2 && p < buf + ret; p++) | |||
195 | zeros += !*p; | |||
196 | ||||
197 | ret = 0; | |||
198 | switch (zeros) { | |||
199 | case 2: | |||
200 | if ((strcmp (basename (buf), basename (PYTHON))__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (basename (buf)) && __builtin_constant_p (basename ( "/usr/bin/python")) && (__s1_len = strlen (basename ( buf)), __s2_len = strlen (basename ("/usr/bin/python")), (!(( size_t)(const void *)((basename (buf)) + 1) - (size_t)(const void *)(basename (buf)) == 1) || __s1_len >= 4) && (!( (size_t)(const void *)((basename ("/usr/bin/python")) + 1) - ( size_t)(const void *)(basename ("/usr/bin/python")) == 1) || __s2_len >= 4)) ? __builtin_strcmp (basename (buf), basename ("/usr/bin/python" )) : (__builtin_constant_p (basename (buf)) && ((size_t )(const void *)((basename (buf)) + 1) - (size_t)(const void * )(basename (buf)) == 1) && (__s1_len = strlen (basename (buf)), __s1_len < 4) ? (__builtin_constant_p (basename ( "/usr/bin/python")) && ((size_t)(const void *)((basename ("/usr/bin/python")) + 1) - (size_t)(const void *)(basename ( "/usr/bin/python")) == 1) ? __builtin_strcmp (basename (buf), basename ("/usr/bin/python")) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (basename ("/usr/bin/python")); int __result = (((const unsigned char * ) (const char *) (basename (buf)))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename (buf)))[1] - __s2[1]); if ( __s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename (buf)))[2] - __s2[ 2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (basename (buf)))[3 ] - __s2[3]); } } __result; }))) : (__builtin_constant_p (basename ("/usr/bin/python")) && ((size_t)(const void *)((basename ("/usr/bin/python")) + 1) - (size_t)(const void *)(basename ( "/usr/bin/python")) == 1) && (__s2_len = strlen (basename ("/usr/bin/python")), __s2_len < 4) ? (__builtin_constant_p (basename (buf)) && ((size_t)(const void *)((basename (buf)) + 1) - (size_t)(const void *)(basename (buf)) == 1) ? __builtin_strcmp (basename (buf), basename ("/usr/bin/python" )) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (basename (buf)); int __result = (((const unsigned char *) (const char *) (basename ("/usr/bin/python" )))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename ("/usr/bin/python")))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename ("/usr/bin/python")))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (basename ("/usr/bin/python")))[3] - __s2 [3]); } } __result; })))) : __builtin_strcmp (basename (buf), basename ("/usr/bin/python"))))); }) || | |||
201 | strcmp (basename (buf + strlen (buf) + 1), GSYNCD_PY)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (basename (buf + strlen (buf) + 1)) && __builtin_constant_p ("gsyncd.py") && (__s1_len = strlen (basename (buf + strlen (buf) + 1)), __s2_len = strlen ("gsyncd.py"), (!((size_t )(const void *)((basename (buf + strlen (buf) + 1)) + 1) - (size_t )(const void *)(basename (buf + strlen (buf) + 1)) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("gsyncd.py") + 1) - (size_t)(const void *)("gsyncd.py") == 1) || __s2_len >= 4)) ? __builtin_strcmp (basename (buf + strlen (buf) + 1), "gsyncd.py" ) : (__builtin_constant_p (basename (buf + strlen (buf) + 1)) && ((size_t)(const void *)((basename (buf + strlen ( buf) + 1)) + 1) - (size_t)(const void *)(basename (buf + strlen (buf) + 1)) == 1) && (__s1_len = strlen (basename (buf + strlen (buf) + 1)), __s1_len < 4) ? (__builtin_constant_p ("gsyncd.py") && ((size_t)(const void *)(("gsyncd.py" ) + 1) - (size_t)(const void *)("gsyncd.py") == 1) ? __builtin_strcmp (basename (buf + strlen (buf) + 1), "gsyncd.py") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("gsyncd.py"); int __result = (((const unsigned char *) (const char *) (basename (buf + strlen (buf) + 1)))[0] - __s2 [0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename (buf + strlen (buf) + 1)))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( basename (buf + strlen (buf) + 1)))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (basename (buf + strlen (buf) + 1)))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("gsyncd.py" ) && ((size_t)(const void *)(("gsyncd.py") + 1) - (size_t )(const void *)("gsyncd.py") == 1) && (__s2_len = strlen ("gsyncd.py"), __s2_len < 4) ? (__builtin_constant_p (basename (buf + strlen (buf) + 1)) && ((size_t)(const void *) ((basename (buf + strlen (buf) + 1)) + 1) - (size_t)(const void *)(basename (buf + strlen (buf) + 1)) == 1) ? __builtin_strcmp (basename (buf + strlen (buf) + 1), "gsyncd.py") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (basename (buf + strlen (buf) + 1)); int __result = ( ((const unsigned char *) (const char *) ("gsyncd.py"))[0] - __s2 [0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("gsyncd.py"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("gsyncd.py"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("gsyncd.py"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (basename (buf + strlen (buf) + 1), "gsyncd.py")))); })) == 0) { | |||
202 | ret = 1; | |||
203 | break; | |||
204 | } | |||
205 | /* fallthrough */ | |||
206 | case 1: | |||
207 | if (strcmp (basename (buf), GSYNCD_PY)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (basename (buf)) && __builtin_constant_p ("gsyncd.py" ) && (__s1_len = strlen (basename (buf)), __s2_len = strlen ("gsyncd.py"), (!((size_t)(const void *)((basename (buf)) + 1 ) - (size_t)(const void *)(basename (buf)) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("gsyncd.py") + 1) - (size_t)(const void *)("gsyncd.py") == 1) || __s2_len >= 4 )) ? __builtin_strcmp (basename (buf), "gsyncd.py") : (__builtin_constant_p (basename (buf)) && ((size_t)(const void *)((basename (buf)) + 1) - (size_t)(const void *)(basename (buf)) == 1) && (__s1_len = strlen (basename (buf)), __s1_len < 4) ? (__builtin_constant_p ("gsyncd.py") && ((size_t)(const void *)(("gsyncd.py" ) + 1) - (size_t)(const void *)("gsyncd.py") == 1) ? __builtin_strcmp (basename (buf), "gsyncd.py") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("gsyncd.py" ); int __result = (((const unsigned char *) (const char *) (basename (buf)))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( basename (buf)))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename (buf)))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char * ) (const char *) (basename (buf)))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p ("gsyncd.py") && ((size_t )(const void *)(("gsyncd.py") + 1) - (size_t)(const void *)("gsyncd.py" ) == 1) && (__s2_len = strlen ("gsyncd.py"), __s2_len < 4) ? (__builtin_constant_p (basename (buf)) && ( (size_t)(const void *)((basename (buf)) + 1) - (size_t)(const void *)(basename (buf)) == 1) ? __builtin_strcmp (basename ( buf), "gsyncd.py") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (basename (buf )); int __result = (((const unsigned char *) (const char *) ( "gsyncd.py"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( "gsyncd.py"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( "gsyncd.py"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("gsyncd.py" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (basename (buf), "gsyncd.py")))); }) == 0) | |||
208 | ret = 1; | |||
209 | } | |||
210 | ||||
211 | if (ret == 1) { | |||
212 | if (pida[1] != -1) { | |||
213 | fprintf (stderrstderr, GSYNCD_PY"gsyncd.py"" sibling is not unique"); | |||
214 | return -1; | |||
215 | } | |||
216 | pida[1] = pid; | |||
217 | } | |||
218 | ||||
219 | return 0; | |||
220 | } | |||
221 | ||||
222 | static int | |||
223 | invoke_rsync (int argc, char **argv) | |||
224 | { | |||
225 | int i = 0; | |||
226 | char path[PATH_MAX4096] = {0,}; | |||
227 | pid_t pid = -1; | |||
228 | pid_t ppid = -1; | |||
229 | pid_t pida[] = {-1, -1}; | |||
230 | char *name = NULL((void*)0); | |||
231 | char buf[PATH_MAX4096 + 1] = {0,}; | |||
232 | int ret = 0; | |||
233 | ||||
234 | assert (argv[argc] == NULL)((argv[argc] == ((void*)0)) ? (void) (0) : __assert_fail ("argv[argc] == ((void*)0)" , "gsyncd.c", 234, __PRETTY_FUNCTION__)); | |||
235 | ||||
236 | if (argc < 2 || strcmp (argv[1], "--server")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[1]) && __builtin_constant_p ("--server") && (__s1_len = strlen (argv[1]), __s2_len = strlen ("--server") , (!((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) || __s1_len >= 4) && (!((size_t )(const void *)(("--server") + 1) - (size_t)(const void *)("--server" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[1], "--server" ) : (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1 ) && (__s1_len = strlen (argv[1]), __s1_len < 4) ? (__builtin_constant_p ("--server") && ((size_t)(const void *)(("--server") + 1) - (size_t)(const void *)("--server" ) == 1) ? __builtin_strcmp (argv[1], "--server") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("--server"); int __result = (((const unsigned char * ) (const char *) (argv[1]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[1]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[1]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[1]))[3] - __s2[3]); } } __result; }) )) : (__builtin_constant_p ("--server") && ((size_t)( const void *)(("--server") + 1) - (size_t)(const void *)("--server" ) == 1) && (__s2_len = strlen ("--server"), __s2_len < 4) ? (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1 ) ? __builtin_strcmp (argv[1], "--server") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (argv[1]); int __result = (((const unsigned char *) ( const char *) ("--server"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("--server"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("--server"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("--server"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (argv[1], "--server")))); }) != 0) | |||
237 | goto error; | |||
238 | ||||
239 | for (i = 2; i < argc && argv[i][0] == '-'; i++); | |||
240 | ||||
241 | if (!(i == argc - 2 && strcmp (argv[i], ".")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[i]) && __builtin_constant_p (".") && ( __s1_len = strlen (argv[i]), __s2_len = strlen ("."), (!((size_t )(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[ i]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((".") + 1) - (size_t)(const void *)(".") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[i], ".") : (__builtin_constant_p (argv[i]) && ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1) && (__s1_len = strlen (argv[i]), __s1_len < 4) ? (__builtin_constant_p ( ".") && ((size_t)(const void *)((".") + 1) - (size_t) (const void *)(".") == 1) ? __builtin_strcmp (argv[i], ".") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("."); int __result = (((const unsigned char *) (const char *) (argv[i]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[i]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[i]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[i]))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p (".") && ((size_t)(const void *)((".") + 1) - (size_t)(const void *)(".") == 1) && (__s2_len = strlen ("."), __s2_len < 4) ? (__builtin_constant_p (argv[i]) && ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1) ? __builtin_strcmp (argv [i], ".") : (- (__extension__ ({ const unsigned char *__s2 = ( const unsigned char *) (const char *) (argv[i]); int __result = (((const unsigned char *) (const char *) ("."))[0] - __s2[ 0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("."))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("."))[2] - __s2[ 2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("."))[3] - __s2[3] ); } } __result; })))) : __builtin_strcmp (argv[i], ".")))); } ) == 0 && argv[i + 1][0] == '/')) { | |||
242 | fprintf (stderrstderr, "need an rsync invocation without protected args\n"); | |||
243 | goto error; | |||
244 | } | |||
245 | ||||
246 | /* look up sshd we are spawned from */ | |||
247 | for (pid = getpid () ;; pid = ppid) { | |||
248 | ppid = pidinfo (pid, &name); | |||
249 | if (ppid < 0) { | |||
250 | fprintf (stderrstderr, "sshd ancestor not found\n"); | |||
251 | goto error; | |||
252 | } | |||
253 | if (strcmp (name, "sshd")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (name) && __builtin_constant_p ("sshd") && ( __s1_len = strlen (name), __s2_len = strlen ("sshd"), (!((size_t )(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) || __s1_len >= 4) && (!((size_t)(const void *) (("sshd") + 1) - (size_t)(const void *)("sshd") == 1) || __s2_len >= 4)) ? __builtin_strcmp (name, "sshd") : (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t )(const void *)(name) == 1) && (__s1_len = strlen (name ), __s1_len < 4) ? (__builtin_constant_p ("sshd") && ((size_t)(const void *)(("sshd") + 1) - (size_t)(const void * )("sshd") == 1) ? __builtin_strcmp (name, "sshd") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("sshd"); int __result = (((const unsigned char *) ( const char *) (name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (name))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("sshd") && ((size_t)(const void *)(("sshd") + 1) - ( size_t)(const void *)("sshd") == 1) && (__s2_len = strlen ("sshd"), __s2_len < 4) ? (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *) (name) == 1) ? __builtin_strcmp (name, "sshd") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (name); int __result = (((const unsigned char *) (const char *) ("sshd"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("sshd"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("sshd"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("sshd"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (name, "sshd")))); }) == 0) { | |||
254 | GF_FREE (name)__gf_free (name); | |||
255 | break; | |||
256 | } | |||
257 | GF_FREE (name)__gf_free (name); | |||
258 | } | |||
259 | /* look up "ssh-sibling" gsyncd */ | |||
260 | pida[0] = pid; | |||
261 | ret = prociter (find_gsyncd, pida); | |||
262 | if (ret == -1 || pida[1] == -1) { | |||
263 | fprintf (stderrstderr, "gsyncd sibling not found\n"); | |||
264 | goto error; | |||
265 | } | |||
266 | /* check if rsync target matches gsyncd target */ | |||
267 | sprintf (path, PROC"/proc""/%d/cwd", pida[1]); | |||
268 | ret = readlink (path, buf, sizeof (buf)); | |||
269 | if (ret == -1 || ret == sizeof (buf)) | |||
270 | goto error; | |||
271 | if (strcmp (argv[argc - 1], "/")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[argc - 1]) && __builtin_constant_p ("/") && (__s1_len = strlen (argv[argc - 1]), __s2_len = strlen ("/") , (!((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)( const void *)(argv[argc - 1]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("/") + 1) - (size_t)(const void * )("/") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[argc - 1], "/") : (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) && (__s1_len = strlen ( argv[argc - 1]), __s1_len < 4) ? (__builtin_constant_p ("/" ) && ((size_t)(const void *)(("/") + 1) - (size_t)(const void *)("/") == 1) ? __builtin_strcmp (argv[argc - 1], "/") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("/"); int __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[0] - __s2[0]); if ( __s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1])) [2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("/") && ((size_t)(const void *)(("/") + 1) - (size_t )(const void *)("/") == 1) && (__s2_len = strlen ("/" ), __s2_len < 4) ? (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) ? __builtin_strcmp (argv[argc - 1], "/") : (- (__extension__ ({ const unsigned char *__s2 = ( const unsigned char *) (const char *) (argv[argc - 1]); int __result = (((const unsigned char *) (const char *) ("/"))[0] - __s2[ 0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("/"))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("/"))[2] - __s2[ 2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("/"))[3] - __s2[3] ); } } __result; })))) : __builtin_strcmp (argv[argc - 1], "/" )))); }) == 0 /* root dir cannot be a target */ || | |||
272 | (strcmp (argv[argc - 1], path)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[argc - 1]) && __builtin_constant_p (path) && (__s1_len = strlen (argv[argc - 1]), __s2_len = strlen (path ), (!((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t) (const void *)(argv[argc - 1]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((path) + 1) - (size_t)(const void * )(path) == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[ argc - 1], path) : (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) && (__s1_len = strlen ( argv[argc - 1]), __s1_len < 4) ? (__builtin_constant_p (path ) && ((size_t)(const void *)((path) + 1) - (size_t)(const void *)(path) == 1) ? __builtin_strcmp (argv[argc - 1], path ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (path); int __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[0] - __s2[0]); if ( __s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1])) [2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (path) && ((size_t)(const void *)((path) + 1) - (size_t )(const void *)(path) == 1) && (__s2_len = strlen (path ), __s2_len < 4) ? (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) ? __builtin_strcmp (argv[argc - 1], path) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (argv[argc - 1]); int __result = (((const unsigned char *) (const char *) (path))[ 0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (path))[ 1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (path))[ 2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (path))[3] - __s2 [3]); } } __result; })))) : __builtin_strcmp (argv[argc - 1], path)))); }) /* match against gluster target */ && | |||
273 | strcmp (argv[argc - 1], buf)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[argc - 1]) && __builtin_constant_p (buf) && (__s1_len = strlen (argv[argc - 1]), __s2_len = strlen (buf) , (!((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)( const void *)(argv[argc - 1]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((buf) + 1) - (size_t)(const void * )(buf) == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[argc - 1], buf) : (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) && (__s1_len = strlen ( argv[argc - 1]), __s1_len < 4) ? (__builtin_constant_p (buf ) && ((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1) ? __builtin_strcmp (argv[argc - 1], buf) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (buf); int __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[0] - __s2[0]); if ( __s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[1] - __s2[ 1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[argc - 1])) [2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[argc - 1]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (buf) && ((size_t)(const void *)((buf) + 1) - (size_t )(const void *)(buf) == 1) && (__s2_len = strlen (buf ), __s2_len < 4) ? (__builtin_constant_p (argv[argc - 1]) && ((size_t)(const void *)((argv[argc - 1]) + 1) - (size_t)(const void *)(argv[argc - 1]) == 1) ? __builtin_strcmp (argv[argc - 1], buf) : (- (__extension__ ({ const unsigned char *__s2 = ( const unsigned char *) (const char *) (argv[argc - 1]); int __result = (((const unsigned char *) (const char *) (buf))[0] - __s2[ 0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (buf))[2] - __s2[ 2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (buf))[3] - __s2[3] ); } } __result; })))) : __builtin_strcmp (argv[argc - 1], buf )))); }) /* match against file target */) != 0) { | |||
274 | fprintf (stderrstderr, "rsync target does not match "GEOREP"geo-replication"" session\n"); | |||
275 | goto error; | |||
276 | } | |||
277 | ||||
278 | argv[0] = RSYNC"rsync"; | |||
279 | ||||
280 | execvp (RSYNC"rsync", argv); | |||
281 | ||||
282 | fprintf (stderrstderr, "exec of "RSYNC"rsync"" failed\n"); | |||
283 | return 127; | |||
284 | ||||
285 | error: | |||
286 | fprintf (stderrstderr, "disallowed "RSYNC"rsync"" invocation\n"); | |||
287 | return 1; | |||
288 | } | |||
289 | ||||
290 | static int | |||
291 | invoke_gluster (int argc, char **argv) | |||
292 | { | |||
293 | int i = 0; | |||
294 | int j = 0; | |||
295 | int optsover = 0; | |||
296 | char *ov = NULL((void*)0); | |||
297 | ||||
298 | for (i = 1; i < argc; i++) { | |||
299 | ov = strtail (argv[i], "--"); | |||
300 | if (ov && !optsover) { | |||
301 | if (*ov == '\0') | |||
302 | optsover = 1; | |||
303 | continue; | |||
304 | } | |||
305 | switch (++j) { | |||
306 | case 1: | |||
307 | if (strcmp (argv[i], "volume")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[i]) && __builtin_constant_p ("volume") && (__s1_len = strlen (argv[i]), __s2_len = strlen ("volume"), ( !((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1) || __s1_len >= 4) && (!((size_t )(const void *)(("volume") + 1) - (size_t)(const void *)("volume" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[i], "volume" ) : (__builtin_constant_p (argv[i]) && ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1 ) && (__s1_len = strlen (argv[i]), __s1_len < 4) ? (__builtin_constant_p ("volume") && ((size_t)(const void *)(("volume") + 1) - (size_t)(const void *)("volume") == 1) ? __builtin_strcmp (argv[i], "volume") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("volume"); int __result = (((const unsigned char *) (const char *) (argv[i]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( argv[i]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( argv[i]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv [i]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("volume") && ((size_t)(const void *)(("volume") + 1 ) - (size_t)(const void *)("volume") == 1) && (__s2_len = strlen ("volume"), __s2_len < 4) ? (__builtin_constant_p (argv[i]) && ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1) ? __builtin_strcmp (argv [i], "volume") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (argv[i]); int __result = (((const unsigned char *) (const char *) ("volume"))[0] - __s2 [0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("volume"))[1] - __s2 [1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("volume"))[2] - __s2 [2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("volume"))[3] - __s2 [3]); } } __result; })))) : __builtin_strcmp (argv[i], "volume" )))); }) != 0) | |||
308 | goto error; | |||
309 | break; | |||
310 | case 2: | |||
311 | if (strcmp (argv[i], "info")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[i]) && __builtin_constant_p ("info") && (__s1_len = strlen (argv[i]), __s2_len = strlen ("info"), (! ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void * )(argv[i]) == 1) || __s1_len >= 4) && (!((size_t)( const void *)(("info") + 1) - (size_t)(const void *)("info") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[i], "info" ) : (__builtin_constant_p (argv[i]) && ((size_t)(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[i]) == 1 ) && (__s1_len = strlen (argv[i]), __s1_len < 4) ? (__builtin_constant_p ("info") && ((size_t)(const void *)(("info") + 1) - (size_t)(const void *)("info") == 1) ? __builtin_strcmp (argv[i], "info") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("info"); int __result = (((const unsigned char *) (const char *) (argv[i]))[0] - __s2 [0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[i]))[1] - __s2 [1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[i]))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[i]))[3] - __s2 [3]); } } __result; }))) : (__builtin_constant_p ("info") && ((size_t)(const void *)(("info") + 1) - (size_t)(const void * )("info") == 1) && (__s2_len = strlen ("info"), __s2_len < 4) ? (__builtin_constant_p (argv[i]) && ((size_t )(const void *)((argv[i]) + 1) - (size_t)(const void *)(argv[ i]) == 1) ? __builtin_strcmp (argv[i], "info") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (argv[i]); int __result = (((const unsigned char *) ( const char *) ("info"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("info"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("info"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("info"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (argv[i], "info")))); }) != 0) | |||
312 | goto error; | |||
313 | break; | |||
314 | case 3: | |||
315 | break; | |||
316 | default: | |||
317 | goto error; | |||
318 | } | |||
319 | } | |||
320 | ||||
321 | argv[0] = "gluster"; | |||
322 | execvp (SBIN_DIR"/usr/local/sbin""/gluster", argv); | |||
323 | fprintf (stderrstderr, "exec of gluster failed\n"); | |||
324 | return 127; | |||
325 | ||||
326 | error: | |||
327 | fprintf (stderrstderr, "disallowed gluster invocation\n"); | |||
328 | return 1; | |||
329 | } | |||
330 | ||||
331 | struct invocable { | |||
332 | char *name; | |||
333 | int (*invoker) (int argc, char **argv); | |||
334 | }; | |||
335 | ||||
336 | struct invocable invocables[] = { | |||
337 | { "rsync", invoke_rsync }, | |||
338 | { "gsyncd", invoke_gsyncd }, | |||
339 | { "gluster", invoke_gluster }, | |||
340 | { NULL((void*)0), NULL((void*)0)} | |||
341 | }; | |||
342 | ||||
343 | int | |||
344 | main (int argc, char **argv) | |||
345 | { | |||
346 | int ret = -1; | |||
347 | char *evas = NULL((void*)0); | |||
348 | struct invocable *i = NULL((void*)0); | |||
349 | char *b = NULL((void*)0); | |||
350 | char *sargv = NULL((void*)0); | |||
351 | ||||
352 | #ifdef USE_LIBGLUSTERFS1 | |||
353 | glusterfs_ctx_t *ctx = NULL((void*)0); | |||
354 | ||||
355 | ctx = glusterfs_ctx_new (); | |||
356 | if (!ctx) | |||
| ||||
357 | return ENOMEM12; | |||
358 | ||||
359 | if (glusterfs_globals_init (ctx)) | |||
360 | return 1; | |||
361 | ||||
362 | THIS(*__glusterfs_this_location())->ctx = ctx; | |||
363 | ret = default_mem_acct_init (THIS(*__glusterfs_this_location())); | |||
364 | if (ret) { | |||
365 | fprintf (stderrstderr, "internal error: mem accounting failed\n"); | |||
366 | return 1; | |||
367 | } | |||
368 | #endif | |||
369 | ||||
370 | evas = getenv (_GLUSTERD_CALLED_"_GLUSTERD_CALLED_"); | |||
371 | if (evas && strcmp (evas, "1")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (evas) && __builtin_constant_p ("1") && (__s1_len = strlen (evas), __s2_len = strlen ("1"), (!((size_t)(const void *)((evas) + 1) - (size_t)(const void *)(evas) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("1") + 1) - ( size_t)(const void *)("1") == 1) || __s2_len >= 4)) ? __builtin_strcmp (evas, "1") : (__builtin_constant_p (evas) && ((size_t )(const void *)((evas) + 1) - (size_t)(const void *)(evas) == 1) && (__s1_len = strlen (evas), __s1_len < 4) ? ( __builtin_constant_p ("1") && ((size_t)(const void *) (("1") + 1) - (size_t)(const void *)("1") == 1) ? __builtin_strcmp (evas, "1") : (__extension__ ({ const unsigned char *__s2 = ( const unsigned char *) (const char *) ("1"); int __result = ( ((const unsigned char *) (const char *) (evas))[0] - __s2[0]) ; if (__s1_len > 0 && __result == 0) { __result = ( ((const unsigned char *) (const char *) (evas))[1] - __s2[1]) ; if (__s1_len > 1 && __result == 0) { __result = ( ((const unsigned char *) (const char *) (evas))[2] - __s2[2]) ; if (__s1_len > 2 && __result == 0) __result = (( (const unsigned char *) (const char *) (evas))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("1") && ( (size_t)(const void *)(("1") + 1) - (size_t)(const void *)("1" ) == 1) && (__s2_len = strlen ("1"), __s2_len < 4) ? (__builtin_constant_p (evas) && ((size_t)(const void *)((evas) + 1) - (size_t)(const void *)(evas) == 1) ? __builtin_strcmp (evas, "1") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (evas); int __result = (((const unsigned char *) (const char *) ("1"))[0] - __s2[ 0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("1"))[1] - __s2[ 1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("1"))[2] - __s2[ 2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("1"))[3] - __s2[3] ); } } __result; })))) : __builtin_strcmp (evas, "1")))); }) == 0) | |||
372 | /* OK, we know glusterd called us, no need to look for further config | |||
373 | *...although this conclusion should not inherit to our children | |||
374 | */ | |||
375 | unsetenv (_GLUSTERD_CALLED_"_GLUSTERD_CALLED_"); | |||
376 | else { | |||
377 | /* we regard all gsyncd invocations unsafe | |||
378 | * that do not come from glusterd and | |||
379 | * therefore restrict it | |||
380 | */ | |||
381 | restricted = 1; | |||
382 | ||||
383 | if (!getenv (_GSYNCD_DISPATCHED_"_GSYNCD_DISPATCHED_")) { | |||
384 | evas = getenv ("SSH_ORIGINAL_COMMAND"); | |||
385 | if (evas) | |||
386 | sargv = evas; | |||
387 | else { | |||
388 | evas = getenv ("SHELL"); | |||
389 | if (evas && strcmp (basename (evas), "gsyncd")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (basename (evas)) && __builtin_constant_p ("gsyncd") && (__s1_len = strlen (basename (evas)), __s2_len = strlen ("gsyncd"), (!((size_t)(const void *)((basename (evas)) + 1) - (size_t)(const void *)(basename (evas)) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("gsyncd") + 1) - (size_t )(const void *)("gsyncd") == 1) || __s2_len >= 4)) ? __builtin_strcmp (basename (evas), "gsyncd") : (__builtin_constant_p (basename (evas)) && ((size_t)(const void *)((basename (evas)) + 1) - (size_t)(const void *)(basename (evas)) == 1) && (__s1_len = strlen (basename (evas)), __s1_len < 4) ? (__builtin_constant_p ("gsyncd") && ((size_t)(const void *)(("gsyncd") + 1 ) - (size_t)(const void *)("gsyncd") == 1) ? __builtin_strcmp (basename (evas), "gsyncd") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("gsyncd" ); int __result = (((const unsigned char *) (const char *) (basename (evas)))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( basename (evas)))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (basename (evas)))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char * ) (const char *) (basename (evas)))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p ("gsyncd") && ((size_t )(const void *)(("gsyncd") + 1) - (size_t)(const void *)("gsyncd" ) == 1) && (__s2_len = strlen ("gsyncd"), __s2_len < 4) ? (__builtin_constant_p (basename (evas)) && ((size_t )(const void *)((basename (evas)) + 1) - (size_t)(const void * )(basename (evas)) == 1) ? __builtin_strcmp (basename (evas), "gsyncd") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (basename (evas)); int __result = (((const unsigned char *) (const char *) ("gsyncd" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("gsyncd" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("gsyncd" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("gsyncd" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (basename (evas), "gsyncd")))); }) == 0 && | |||
390 | argc == 3 && strcmp (argv[1], "-c")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[1]) && __builtin_constant_p ("-c") && ( __s1_len = strlen (argv[1]), __s2_len = strlen ("-c"), (!((size_t )(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[ 1]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("-c") + 1) - (size_t)(const void *)("-c") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[1], "-c") : (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) && (__s1_len = strlen (argv[1]), __s1_len < 4) ? (__builtin_constant_p ( "-c") && ((size_t)(const void *)(("-c") + 1) - (size_t )(const void *)("-c") == 1) ? __builtin_strcmp (argv[1], "-c" ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("-c"); int __result = (((const unsigned char *) (const char *) (argv[1]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[1]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (argv[1]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (argv[1]))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p ("-c") && ((size_t)(const void *)(("-c") + 1) - (size_t)(const void *)("-c") == 1) && (__s2_len = strlen ("-c"), __s2_len < 4) ? (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) ? __builtin_strcmp (argv [1], "-c") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (argv[1]); int __result = (((const unsigned char *) (const char *) ("-c"))[0] - __s2 [0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("-c"))[1] - __s2 [1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ("-c"))[2] - __s2 [2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("-c"))[3] - __s2[3 ]); } } __result; })))) : __builtin_strcmp (argv[1], "-c")))) ; }) == 0) | |||
391 | sargv = argv[2]; | |||
392 | } | |||
393 | } | |||
394 | ||||
395 | } | |||
396 | ||||
397 | if (!(sargv && restricted)) | |||
398 | return invoke_gsyncd (argc, argv); | |||
399 | ||||
400 | argc = str2argv (sargv, &argv); | |||
401 | if (argc == -1 || setenv (_GSYNCD_DISPATCHED_"_GSYNCD_DISPATCHED_", "1", 1) == -1) { | |||
402 | fprintf (stderrstderr, "internal error\n"); | |||
| ||||
403 | return 1; | |||
404 | } | |||
405 | ||||
406 | b = basename (argv[0]); | |||
407 | for (i = invocables; i->name; i++) { | |||
408 | if (strcmp (b, i->name)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (b) && __builtin_constant_p (i->name) && ( __s1_len = strlen (b), __s2_len = strlen (i->name), (!((size_t )(const void *)((b) + 1) - (size_t)(const void *)(b) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((i-> name) + 1) - (size_t)(const void *)(i->name) == 1) || __s2_len >= 4)) ? __builtin_strcmp (b, i->name) : (__builtin_constant_p (b) && ((size_t)(const void *)((b) + 1) - (size_t)(const void *)(b) == 1) && (__s1_len = strlen (b), __s1_len < 4) ? (__builtin_constant_p (i->name) && ((size_t )(const void *)((i->name) + 1) - (size_t)(const void *)(i-> name) == 1) ? __builtin_strcmp (b, i->name) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (i->name); int __result = (((const unsigned char * ) (const char *) (b))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (b))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( b))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (b))[ 3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (i-> name) && ((size_t)(const void *)((i->name) + 1) - ( size_t)(const void *)(i->name) == 1) && (__s2_len = strlen (i->name), __s2_len < 4) ? (__builtin_constant_p (b) && ((size_t)(const void *)((b) + 1) - (size_t)(const void *)(b) == 1) ? __builtin_strcmp (b, i->name) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (b); int __result = (((const unsigned char *) (const char *) (i->name))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (i->name))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (i->name))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (i->name))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (b, i->name)))); }) == 0) | |||
409 | return i->invoker (argc, argv); | |||
410 | } | |||
411 | ||||
412 | fprintf (stderrstderr, "invoking %s in restricted SSH session is not allowed\n", | |||
413 | b); | |||
414 | ||||
415 | return 1; | |||
416 | } |