Lines 46-52
Link Here
|
46 |
|
46 |
|
47 |
|
47 |
|
48 |
static void |
48 |
static void |
49 |
become_user (uid_t uid, const gchar* dest) |
49 |
become_user (uid_t uid) |
50 |
{ |
50 |
{ |
51 |
int res; |
51 |
int res; |
52 |
struct passwd *pwent; |
52 |
struct passwd *pwent; |
Lines 56-66
Link Here
|
56 |
exit (1); |
56 |
exit (1); |
57 |
} |
57 |
} |
58 |
|
58 |
|
59 |
if (dest == NULL) { |
|
|
60 |
g_critical ("invalid dest"); |
61 |
exit (1); |
62 |
} |
63 |
|
64 |
errno = 0; |
59 |
errno = 0; |
65 |
pwent = getpwuid (uid); |
60 |
pwent = getpwuid (uid); |
66 |
if (pwent == NULL) { |
61 |
if (pwent == NULL) { |
Lines 70-86
Link Here
|
70 |
|
65 |
|
71 |
/* set the group */ |
66 |
/* set the group */ |
72 |
errno = 0; |
67 |
errno = 0; |
73 |
res = setgid (pwent->pw_gid); |
68 |
res = setegid (pwent->pw_gid); |
74 |
if (res == -1) { |
69 |
if (res == -1) { |
75 |
g_warning ("Error performing setgid: %s", g_strerror (errno)); |
70 |
g_warning ("Error performing setegid: %s", g_strerror (errno)); |
76 |
exit (1); |
71 |
exit (1); |
77 |
} |
72 |
} |
78 |
|
73 |
|
79 |
/* become the user */ |
74 |
/* become the user */ |
80 |
errno = 0; |
75 |
errno = 0; |
81 |
res = setuid (uid); |
76 |
res = seteuid (uid); |
82 |
if (res == -1) { |
77 |
if (res == -1) { |
83 |
g_warning ("Error performing setuid: %s", g_strerror (errno)); |
78 |
g_warning ("Error performing seteuid: %s", g_strerror (errno)); |
84 |
exit (1); |
79 |
exit (1); |
85 |
} |
80 |
} |
86 |
} |
81 |
} |
Lines 91-97
Link Here
|
91 |
int typeflag, |
86 |
int typeflag, |
92 |
struct FTW *ftwbuf) |
87 |
struct FTW *ftwbuf) |
93 |
{ |
88 |
{ |
94 |
int ret = remove (fpath); |
89 |
int ret = ftwbuf->level > 0 ? remove (fpath) : 0; |
95 |
|
90 |
|
96 |
if (ret) { |
91 |
if (ret) { |
97 |
g_error ("Failed to remove %s, reason was: %s", fpath, strerror(errno)); |
92 |
g_error ("Failed to remove %s, reason was: %s", fpath, strerror(errno)); |
Lines 104-110
Link Here
|
104 |
static int |
99 |
static int |
105 |
remove_dest_dir (const gchar *dest) |
100 |
remove_dest_dir (const gchar *dest) |
106 |
{ |
101 |
{ |
107 |
return nftw(dest, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); |
102 |
int ret; |
|
|
103 |
|
104 |
if (ret = nftw(dest, unlink_cb, 64, FTW_DEPTH | FTW_PHYS)) { |
105 |
return ret; |
106 |
} |
107 |
|
108 |
errno = 0; |
109 |
ret = seteuid (getuid ()); |
110 |
if (ret == -1) { |
111 |
g_warning ("Error performing seteuid: %s", g_strerror (errno)); |
112 |
exit (1); |
113 |
} |
114 |
|
115 |
ret = remove (dest); |
116 |
if (ret) { |
117 |
g_error ("Failed to remove %s, reason was: %s", dest, strerror (errno)); |
118 |
errno = 0; |
119 |
} |
120 |
|
121 |
return ret; |
108 |
} |
122 |
} |
109 |
|
123 |
|
110 |
int |
124 |
int |
Lines 161-169
Link Here
|
161 |
exit (1); |
175 |
exit (1); |
162 |
} |
176 |
} |
163 |
|
177 |
|
164 |
become_user (user_id, dest); |
178 |
become_user (user_id); |
165 |
|
|
|
166 |
ret = remove_dest_dir (dest); |
167 |
|
179 |
|
168 |
return ret != TRUE; |
180 |
return remove_dest_dir (dest) == 0 ? 0 : 1; |
169 |
} |
181 |
} |