aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2016-01-22 09:59:12 -0500
committerLibravatar netblue30 <netblue30@yahoo.com>2016-01-22 09:59:12 -0500
commit4d53c56e6c999405107887889866b220df4dd3c2 (patch)
tree8905c15c9be44b21a93aa53c6bfe8633a7b0abf0 /src
parentprofile cleanup (diff)
downloadfirejail-4d53c56e6c999405107887889866b220df4dd3c2.tar.gz
firejail-4d53c56e6c999405107887889866b220df4dd3c2.tar.zst
firejail-4d53c56e6c999405107887889866b220df4dd3c2.zip
fixed .asoundrc problems for Debian sid
Diffstat (limited to 'src')
-rw-r--r--src/firejail/firejail.h1
-rw-r--r--src/firejail/fs_home.c69
2 files changed, 63 insertions, 7 deletions
diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h
index 3a7d84996..21ca6c508 100644
--- a/src/firejail/firejail.h
+++ b/src/firejail/firejail.h
@@ -49,6 +49,7 @@
49#define RUN_WHITELIST_OPT_DIR "/run/firejail/mnt/orig-opt" 49#define RUN_WHITELIST_OPT_DIR "/run/firejail/mnt/orig-opt"
50 50
51#define RUN_XAUTHORITY_FILE "/run/firejail/mnt/.Xauthority" 51#define RUN_XAUTHORITY_FILE "/run/firejail/mnt/.Xauthority"
52#define RUN_ASOUNDRC_FILE "/run/firejail/mnt/.asoundrc"
52#define RUN_HOSTNAME_FILE "/run/firejail/mnt/hostname" 53#define RUN_HOSTNAME_FILE "/run/firejail/mnt/hostname"
53#define RUN_HOSTS_FILE "/run/firejail/mnt/hosts" 54#define RUN_HOSTS_FILE "/run/firejail/mnt/hosts"
54#define RUN_RESOLVCONF_FILE "/run/firejail/mnt/resolv.conf" 55#define RUN_RESOLVCONF_FILE "/run/firejail/mnt/resolv.conf"
diff --git a/src/firejail/fs_home.c b/src/firejail/fs_home.c
index ba62b788a..08141ed03 100644
--- a/src/firejail/fs_home.c
+++ b/src/firejail/fs_home.c
@@ -135,6 +135,28 @@ static int store_xauthority(void) {
135 return 0; 135 return 0;
136} 136}
137 137
138static int store_asoundrc(void) {
139 // put a copy of .Xauthority in XAUTHORITY_FILE
140 fs_build_mnt_dir();
141
142 char *src;
143 char *dest = RUN_ASOUNDRC_FILE;
144 if (asprintf(&src, "%s/.asoundrc", cfg.homedir) == -1)
145 errExit("asprintf");
146
147 struct stat s;
148 if (stat(src, &s) == 0) {
149 int rv = copy_file(src, dest);
150 if (rv) {
151 fprintf(stderr, "Warning: cannot transfer .asoundrc in private home directory\n");
152 return 0;
153 }
154 return 1; // file copied
155 }
156
157 return 0;
158}
159
138static void copy_xauthority(void) { 160static void copy_xauthority(void) {
139 // copy XAUTHORITY_FILE in the new home directory 161 // copy XAUTHORITY_FILE in the new home directory
140 char *src = RUN_XAUTHORITY_FILE ; 162 char *src = RUN_XAUTHORITY_FILE ;
@@ -144,13 +166,38 @@ static void copy_xauthority(void) {
144 int rv = copy_file(src, dest); 166 int rv = copy_file(src, dest);
145 if (rv) 167 if (rv)
146 fprintf(stderr, "Warning: cannot transfer .Xauthority in private home directory\n"); 168 fprintf(stderr, "Warning: cannot transfer .Xauthority in private home directory\n");
147 fs_logger2("clone", dest); 169 else {
170 fs_logger2("clone", dest);
171
172 // set permissions and ownership
173 if (chown(dest, getuid(), getgid()) < 0)
174 errExit("chown");
175 if (chmod(dest, S_IRUSR | S_IWUSR) < 0)
176 errExit("chmod");
177 }
178
179 // delete the temporary file
180 unlink(src);
181}
148 182
149 // set permissions and ownership 183static void copy_asoundrc(void) {
150 if (chown(dest, getuid(), getgid()) < 0) 184 // copy XAUTHORITY_FILE in the new home directory
151 errExit("chown"); 185 char *src = RUN_ASOUNDRC_FILE ;
152 if (chmod(dest, S_IRUSR | S_IWUSR) < 0) 186 char *dest;
153 errExit("chmod"); 187 if (asprintf(&dest, "%s/.asoundrc", cfg.homedir) == -1)
188 errExit("asprintf");
189 int rv = copy_file(src, dest);
190 if (rv)
191 fprintf(stderr, "Warning: cannot transfer .asoundrc in private home directory\n");
192 else {
193 fs_logger2("clone", dest);
194
195 // set permissions and ownership
196 if (chown(dest, getuid(), getgid()) < 0)
197 errExit("chown");
198 if (chmod(dest, S_IRUSR | S_IWUSR) < 0)
199 errExit("chmod");
200 }
154 201
155 // delete the temporary file 202 // delete the temporary file
156 unlink(src); 203 unlink(src);
@@ -168,6 +215,7 @@ void fs_private_homedir(void) {
168 assert(private_homedir); 215 assert(private_homedir);
169 216
170 int xflag = store_xauthority(); 217 int xflag = store_xauthority();
218 int aflag = store_asoundrc();
171 219
172 uid_t u = getuid(); 220 uid_t u = getuid();
173 gid_t g = getgid(); 221 gid_t g = getgid();
@@ -211,6 +259,8 @@ void fs_private_homedir(void) {
211 skel(homedir, u, g); 259 skel(homedir, u, g);
212 if (xflag) 260 if (xflag)
213 copy_xauthority(); 261 copy_xauthority();
262 if (aflag)
263 copy_asoundrc();
214} 264}
215 265
216// private mode (--private): 266// private mode (--private):
@@ -225,6 +275,7 @@ void fs_private(void) {
225 gid_t g = getgid(); 275 gid_t g = getgid();
226 276
227 int xflag = store_xauthority(); 277 int xflag = store_xauthority();
278 int aflag = store_asoundrc();
228 279
229 // mask /home 280 // mask /home
230 if (arg_debug) 281 if (arg_debug)
@@ -258,6 +309,8 @@ void fs_private(void) {
258 skel(homedir, u, g); 309 skel(homedir, u, g);
259 if (xflag) 310 if (xflag)
260 copy_xauthority(); 311 copy_xauthority();
312 if (aflag)
313 copy_asoundrc();
261} 314}
262 315
263static void check_dir_or_file(const char *name) { 316static void check_dir_or_file(const char *name) {
@@ -410,6 +463,7 @@ void fs_private_home_list(void) {
410 assert(private_list); 463 assert(private_list);
411 464
412 int xflag = store_xauthority(); 465 int xflag = store_xauthority();
466 int aflag = store_asoundrc();
413 467
414 uid_t u = getuid(); 468 uid_t u = getuid();
415 gid_t g = getgid(); 469 gid_t g = getgid();
@@ -501,6 +555,7 @@ void fs_private_home_list(void) {
501 skel(homedir, u, g); 555 skel(homedir, u, g);
502 if (xflag) 556 if (xflag)
503 copy_xauthority(); 557 copy_xauthority();
504 558 if (aflag)
559 copy_asoundrc();
505} 560}
506 561