]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Create logfile safely.
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 22 Jan 2009 21:25:46 +0000 (21:25 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 22 Jan 2009 21:25:46 +0000 (21:25 +0000)
(closes issue #14160)
 Reported by: tzafrir
 Patches:
       20090104__bug14160.diff.txt uploaded by Corydon76 (license 14)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@170307 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/abstract_jb.c

index d5a4c7ffd198134f26208246b644d47077f0df2b..440d381861630f2b3a2c23a5e21aa2a162f58002 100644 (file)
@@ -484,6 +484,8 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
        
        /* Create a frame log file */
        if (ast_test_flag(jbconf, AST_JB_LOG)) {
+               char safe_logfile[30] = "/tmp/logfile-XXXXXX";
+               int safe_fd;
                snprintf(name2, sizeof(name2), "%s", chan->name);
                tmp = strchr(name2, '/');
                if (tmp)
@@ -497,14 +499,17 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
                tmp = strchr(name1, '/');
                if (tmp)
                        *tmp = '#';
-               
+
                snprintf(logfile_pathname, sizeof(logfile_pathname),
                        "/tmp/ast_%s_jb_%s--%s.log", jbimpl->name, name1, name2);
-               jb->logfile = fopen(logfile_pathname, "w+b");
-               
-               if (!jb->logfile)
-                       ast_log(LOG_ERROR, "Failed to create frame log file with pathname '%s'\n", logfile_pathname);
-               
+               if (!(safe_fd = mkstemp(safe_logfile)) > -1 || unlink(logfile_pathname) || link(safe_logfile, logfile_pathname) || unlink(safe_logfile) || !(jb->logfile = fdopen(safe_fd, "w+b"))) {
+                       jb->logfile = NULL;
+                       if (safe_fd > -1) {
+                               close(safe_fd);
+                       }
+                       ast_log(LOG_ERROR, "Failed to create frame log file with pathname '%s': %s\n", logfile_pathname, strerror(errno));
+               }
+
                if (res == JB_IMPL_OK)
                        jb_framelog("JB_PUT_FIRST {now=%ld}: Queued frame with ts=%ld and len=%ld\n",
                                now, frr->ts, frr->len);