Bug Summary

File:gsyncd.c
Location:line 402, column 17
Description:Potential leak of memory pointed to by 'argv'

Annotated Source Code

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
45int restricted = 0;
46
47static int
48duplexpand (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
64static int
65str2argv (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)
13
Assuming 'str' is non-null
14
Taking false branch
76 return -1;
77
78 *argv = calloc (argv_len, sizeof (**argv));
15
Memory is allocated
79 if (!*argv)
16
Taking false branch
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
)))
)) {
17
Loop condition is false. Execution continues on line 96
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
103static int
104invoke_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
172static int
173find_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
222static int
223invoke_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
290static int
291invoke_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
331struct invocable {
332 char *name;
333 int (*invoker) (int argc, char **argv);
334};
335
336struct invocable invocables[] = {
337 { "rsync", invoke_rsync },
338 { "gsyncd", invoke_gsyncd },
339 { "gluster", invoke_gluster },
340 { NULL((void*)0), NULL((void*)0)}
341};
342
343int
344main (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)
1
Assuming 'ctx' is non-null
2
Taking false branch
357 return ENOMEM12;
358
359 if (glusterfs_globals_init (ctx))
3
Taking false branch
360 return 1;
361
362 THIS(*__glusterfs_this_location())->ctx = ctx;
363 ret = default_mem_acct_init (THIS(*__glusterfs_this_location()));
364 if (ret) {
4
Assuming 'ret' is 0
5
Taking false branch
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_")) {
6
Taking true branch
384 evas = getenv ("SSH_ORIGINAL_COMMAND");
385 if (evas)
7
Assuming 'evas' is null
8
Taking false branch
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 &&
10
Taking true branch
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)
9
Assuming 'argc' is equal to 3
391 sargv = argv[2];
392 }
393 }
394
395 }
396
397 if (!(sargv && restricted))
11
Taking false branch
398 return invoke_gsyncd (argc, argv);
399
400 argc = str2argv (sargv, &argv);
12
Calling 'str2argv'
18
Returned allocated memory via 2nd parameter
401 if (argc == -1 || setenv (_GSYNCD_DISPATCHED_"_GSYNCD_DISPATCHED_", "1", 1) == -1) {
19
Taking true branch
402 fprintf (stderrstderr, "internal error\n");
20
Potential leak of memory pointed to by 'argv'
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}