123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- $OpenBSD: patch-cda_d_cda_c,v 1.3 2007/04/12 12:28:02 millert Exp $
- --- cda_d/cda.c.orig Sat Feb 5 00:26:38 2000
- +++ cda_d/cda.c Tue May 6 12:36:11 2003
- @@ -349,23 +349,52 @@ cda_init(curstat_t *s)
- STATIC void
- cda_start(curstat_t *s)
- {
- + struct stat stbuf;
- +
- /* Start up libutil */
- util_start();
-
- /* Start up I/O interface */
- di_start(s);
-
- + /*
- + ** NO_FOLLOW isn't supported by all flavours of Unix,
- + ** but at least by linux and openbsd.
- + ** thomas@suse.de
- + */
- /* Open FIFOs - daemon side */
- - if ((cda_sfd[0] = open(spipe, O_RDONLY)) < 0) {
- + if ((cda_sfd[0] = open(spipe, O_RDONLY | O_NOFOLLOW)) < 0) {
- perror("CD audio daemon: cannot open send pipe");
- cda_quit(s);
- exit(4);
- }
- - if ((cda_rfd[0] = open(rpipe, O_WRONLY)) < 0) {
- + if ((cda_rfd[0] = open(rpipe, O_WRONLY | O_NOFOLLOW)) < 0) {
- perror("CD audio daemon: cannot open recv pipe");
- cda_quit(s);
- exit(5);
- }
- +
- + /* Check FIFOs */
- + if (stat(spipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode)) {
- + (void) fprintf(errfp,
- + "CD audio: Send pipe error (daemon): %s\n",
- + spipe);
- + di_halt(s);
- + /* Remove lock */
- + if (dlock[0] != '\0')
- + (void) UNLINK(dlock);
- + exit(6);
- + }
- + if (stat(rpipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode)) {
- + (void) fprintf(errfp,
- + "CD audio: Receive pipe error (daemon): %s\n",
- + rpipe);
- + di_halt(s);
- + /* Remove lock */
- + if (dlock[0] != '\0')
- + (void) UNLINK(dlock);
- + exit(6);
- + }
- }
-
-
- @@ -396,7 +425,7 @@ cda_daemonlock(void)
- fd = open(dlock, O_CREAT | O_EXCL | O_WRONLY);
- if (fd < 0) {
- if (errno == EEXIST) {
- - if ((fd = open(dlock, O_RDONLY)) < 0)
- + if ((fd = open(dlock, O_RDONLY | O_NOFOLLOW)) < 0)
- return FALSE;
-
- if (read(fd, buf, 12) > 0)
- @@ -430,7 +459,7 @@ cda_daemonlock(void)
- (void) write(fd, buf, strlen(buf));
-
- (void) close(fd);
- - (void) chmod(dlock, 0644);
- + (void) chmod(dlock, 0644); /* woudln't 0622 suffice ? */
-
- return TRUE;
- }
- @@ -3592,7 +3621,7 @@ cda_daemon_alive(void)
-
- (void) sprintf(dlock, "%s/cdad.%x", TEMP_DIR, (int) cd_rdev);
-
- - if ((fd = open(dlock, O_RDONLY)) < 0)
- + if ((fd = open(dlock, O_RDONLY | O_NOFOLLOW)) < 0)
- return FALSE;
-
- if (read(fd, buf, 12) < 0) {
- @@ -3644,7 +3673,7 @@ cda_daemon(curstat_t *s)
- /* Make temporary directory, if needed */
- (void) sprintf(emsgp, app_data.str_tmpdirerr, TEMP_DIR);
- if (LSTAT(TEMP_DIR, &stbuf) < 0) {
- - if (!util_mkdir(TEMP_DIR, 0777)) {
- + if (!util_mkdir(TEMP_DIR, 0700)) {
- (void) fprintf(errfp, "%s\n", emsgp);
- return 1;
- }
- @@ -3657,7 +3686,7 @@ cda_daemon(curstat_t *s)
- MEM_FREE(emsgp);
- #endif /* NOMKTMPDIR */
-
- - (void) signal(SIGCHLD, SIG_IGN);
- + (void) signal(SIGCHLD, SIG_DFL);
-
- /* Become a daemon process */
- switch (FORK()) {
- @@ -3817,12 +3846,14 @@ main(int argc, char **argv)
- errfp = stderr;
- s = &status;
-
- +
- /* Hack: Aside from stdin, stdout, stderr, there shouldn't
- * be any other files open, so force-close them. This is
- * necessary in case xmcd was inheriting any open file
- * descriptors from a parent process which is for the
- * CD-ROM device, and violating exclusive-open requirements
- * on some platforms.
- + * thomas@suse.de: not necessary anymore on modern systems
- */
- for (i = 3; i < 10; i++)
- (void) close(i);
- @@ -3941,7 +3972,7 @@ main(int argc, char **argv)
- if (remote > 0)
- app_data.cddb_rmtdsbl = (remote == 1) ? FALSE : TRUE;
- (void) strcpy(cddb_cldata.prog, PROGNAME);
- - (void) strcpy(cddb_cldata.user, util_loginname());
- + (void) strcpy(cddb_cldata.user, util_loginname()); /* bufferoverflow with orig. code here thomas@suse.de */
- cddb_cldata.isdemo = di_isdemo;
- cddb_cldata.curstat_addr = curstat_addr;
- cddb_cldata.fatal_msg = cda_fatal_msg;
- @@ -3981,24 +4012,30 @@ main(int argc, char **argv)
- cda_parse_devlist(s);
-
- /* Open FIFOs - command side */
- - if ((cda_sfd[1] = open(spipe, O_WRONLY)) < 0) {
- + if ((cda_sfd[1] = open(spipe, O_WRONLY | O_NOFOLLOW)) < 0) {
- perror("CD audio: cannot open send pipe");
- CDA_FATAL(
- "Run \"cda on\" first to initialize CD audio daemon."
- );
- }
- - if ((cda_rfd[1] = open(rpipe, O_RDONLY)) < 0) {
- + if ((cda_rfd[1] = open(rpipe, O_RDONLY | O_NOFOLLOW)) < 0) {
- perror("CD audio: cannot open recv pipe for reading");
- CDA_FATAL(
- "Run \"cda on\" first to initialize CD audio daemon."
- );
- }
- - if ((cda_rfd[0] = open(rpipe, O_WRONLY)) < 0) {
- + if ((cda_rfd[0] = open(rpipe, O_WRONLY | O_NOFOLLOW)) < 0) {
- perror("CD audio: cannot open recv pipe for writing");
- CDA_FATAL(
- "Run \"cda on\" first to initialize CD audio daemon."
- );
- }
- +
- + /* Check FIFOs */
- + if (stat(spipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode))
- + CDA_FATAL("Send pipe error");
- + if (stat(rpipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode))
- + CDA_FATAL("Receive pipe error");
-
- /* Handle some signals */
- (void) signal(SIGINT, onintr);
|