]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix various small leaks on error cases
authorNick Mathewson <nickm@torproject.org>
Sat, 29 Dec 2012 03:49:32 +0000 (22:49 -0500)
committerNick Mathewson <nickm@torproject.org>
Sat, 29 Dec 2012 03:49:32 +0000 (22:49 -0500)
Spotted by coverity, bug 7816, bugfix on various versions.

changes/bug7816_023_small [new file with mode: 0644]
src/common/log.c
src/common/util.c
src/or/connection.c
src/or/geoip.c

diff --git a/changes/bug7816_023_small b/changes/bug7816_023_small
new file mode 100644 (file)
index 0000000..cd90f03
--- /dev/null
@@ -0,0 +1,3 @@
+  o Minor bugfixes:
+    - Fix various places where we leak file descriptors or memory on
+      error cases. Spotted by coverity. Fixes parts of bug 7816.
index 5e2e6b5b50a6c846a36ae76bfff01bfd0e131d05..5f0b4f8d9cbdb3e8b3faa0a152e5b6c990709120 100644 (file)
@@ -833,8 +833,10 @@ add_file_log(const log_severity_list_t *severity, const char *filename)
   fd = tor_open_cloexec(filename, O_WRONLY|O_CREAT|O_APPEND, 0644);
   if (fd<0)
     return -1;
-  if (tor_fd_seekend(fd)<0)
+  if (tor_fd_seekend(fd)<0) {
+    close(fd);
     return -1;
+  }
 
   LOCK_LOGS();
   add_stream_log_impl(severity, filename, fd);
index 6fb597a3a522494c2d7c21f903047101179ef977..29aa83e5d63409d7eb2b8c3110c504790094764d 100644 (file)
@@ -2305,8 +2305,10 @@ read_file_to_str(const char *filename, int flags, struct stat *stat_out)
     return NULL;
   }
 
-  if ((uint64_t)(statbuf.st_size)+1 >= SIZE_T_CEILING)
+  if ((uint64_t)(statbuf.st_size)+1 >= SIZE_T_CEILING) {
+    close(fd);
     return NULL;
+  }
 
   string = tor_malloc((size_t)(statbuf.st_size+1));
 
index 4c6826269d79dccf57ac63e302ac19762899d767..8c4228e5cc0502a6c4bd7d57c1c6374aa3f9599e 100644 (file)
@@ -992,6 +992,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
     if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) {
       log_warn(LD_NET,"Bind to %s failed: %s.", address,
                tor_socket_strerror(tor_socket_errno(s)));
+      tor_close_socket(s);
       goto err;
     }
 #ifdef HAVE_PWD_H
@@ -1000,9 +1001,11 @@ connection_listener_new(const struct sockaddr *listensockaddr,
       if (pw == NULL) {
         log_warn(LD_NET,"Unable to chown() %s socket: user %s not found.",
                  address, options->User);
+        tor_close_socket(s);
       } else if (chown(address, pw->pw_uid, pw->pw_gid) < 0) {
         log_warn(LD_NET,"Unable to chown() %s socket: %s.",
                  address, strerror(errno));
+        tor_close_socket(s);
         goto err;
       }
     }
index 6b7cc82b822fa783b06c7ad3cc56ea40b1e101c4..8ca95af2e661e76b178bb53dbb2f304c5f33bae8 100644 (file)
@@ -1316,8 +1316,11 @@ load_bridge_stats(time_t now)
 
   fname = get_datadir_fname2("stats", "bridge-stats");
   contents = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL);
-  if (contents && validate_bridge_stats(contents, now))
+  if (contents && validate_bridge_stats(contents, now)) {
     bridge_stats_extrainfo = contents;
+  } else {
+    tor_free(contents);
+  }
 
   tor_free(fname);
 }