Fix a bunch of issues identified by Coverity scan
authorDavin McCall <davmac@davmac.org>
Sat, 27 Jul 2019 05:01:56 +0000 (15:01 +1000)
committerDavin McCall <davmac@davmac.org>
Sat, 27 Jul 2019 05:31:58 +0000 (15:31 +1000)
src/control.cc
src/dinit.cc
src/dinitctl.cc
src/includes/cpbuffer.h
src/includes/dinit-util.h
src/load-service.cc

index 32573d2f316f68e288f01d324f94d437ff6aa1e8..e2e8d603b8c1687568155256f89c6497a08fd63b 100644 (file)
@@ -693,22 +693,25 @@ bool control_conn_t::query_load_mech()
         char *wd;
         while (true) {
             std::size_t total_size = curpos + std::size_t(try_path_size);
-            reppkt.resize(total_size);
             if (total_size < curpos) {
-                // overflow.
+                // Overflow. In theory we could now limit to size_t max, but the size must already
+                // be crazy long; let's abort.
                 char ack_rep[] = { DINIT_RP_NAK };
                 if (! queue_packet(ack_rep, 1)) return false;
                 return true;
             }
+            reppkt.resize(total_size);
             wd = getcwd(reppkt.data() + curpos, try_path_size);
             if (wd != nullptr) break;
 
-            try_path_size *= uint32_t(2u);
-            if (try_path_size == 0) {
-                // overflow.
+            // Keep doubling the path size we try until it's big enough, or we get numeric overflow
+            uint32_t new_try_path_size = try_path_size * uint32_t(2u);
+            if (new_try_path_size < try_path_size) {
+                // Overflow.
                 char ack_rep[] = { DINIT_RP_NAK };
                 return queue_packet(ack_rep, 1);
             }
+            try_path_size = new_try_path_size;
         }
 
         uint32_t wd_len = std::strlen(reppkt.data() + curpos);
index d82ae143c0882863cb141950689dd756e8ffd851..2481032d9a027451930e293c272da1d857d5cf78 100644 (file)
@@ -306,10 +306,14 @@ int dinit_main(int argc, char **argv)
     if (am_system_init) {
         // setup STDIN, STDOUT, STDERR so that we can use them
         int onefd = open("/dev/console", O_RDONLY, 0);
-        dup2(onefd, 0);
+        if (onefd != -1) {
+            dup2(onefd, 0);
+        }
         int twofd = open("/dev/console", O_RDWR, 0);
-        dup2(twofd, 1);
-        dup2(twofd, 2);
+        if (twofd != -1) {
+            dup2(twofd, 1);
+            dup2(twofd, 2);
+        }
         
         if (onefd > 2) close(onefd);
         if (twofd > 2) close(twofd);
index af128bac58da8e7a558927a1c787dfa810c0cde7..e81019904fc9240d0b96b729e9b44ac110bd76e5 100644 (file)
@@ -704,7 +704,7 @@ static int unpin_service(int socknum, cpbuffer_t &rbuffer, const char *service_n
         char buf[1 + sizeof(handle)];
         buf[0] = DINIT_CP_UNPINSERVICE;
         memcpy(buf + 1, &handle, sizeof(handle));
-        write_all_x(socknum, buf, 2 + sizeof(handle));
+        write_all_x(socknum, buf, sizeof(buf));
         
         wait_for_reply(rbuffer, socknum);
         if (rbuffer[0] != DINIT_RP_ACK) {
index a9f14a026a3ac8b454edadd95c13a741a6bb2b3e..9146a87e65c88543e6af0b5a3b433ca8015da5b5 100644 (file)
@@ -104,7 +104,7 @@ template <int SIZE> class cpbuffer
     char operator[](int idx) noexcept
     {
         int dest_idx = cur_idx + idx;
-        if (dest_idx > SIZE) dest_idx -= SIZE;
+        if (dest_idx >= SIZE) dest_idx -= SIZE;
         return buf[dest_idx];
     }
     
index d9b689c17463c9e15c82a1da20f69a7b5fac06fb..7185370f9d0a711941b7d18fa57ad7fbeb61560a 100644 (file)
@@ -21,7 +21,7 @@ inline ssize_t complete_read(int fd, void * buf, size_t n)
             return r;
         }
         if (res < 0) {
-            if (res == EINTR) {
+            if (errno == EINTR) {
                 continue;
             }
 
index 3040cf34bfe346cd2b431dbe575109d94f80f58f..85cb25080dc74d2982c67cce715ff25004b59501 100644 (file)
@@ -197,7 +197,7 @@ static void parse_timespec(const std::string &paramval, const std::string &servi
 }
 
 // In a vector, find or create rlimits for a particular resource type.
-static service_rlimits &find_rlimits(std::vector<service_rlimits> all_rlimits, int resource_id)
+static service_rlimits &find_rlimits(std::vector<service_rlimits> &all_rlimits, int resource_id)
 {
     for (service_rlimits &limits : all_rlimits) {
         if (limits.resource_id == resource_id) {
@@ -368,6 +368,8 @@ static void process_dep_dir(dirload_service_set &sset,
         log(loglevel_t::WARN, "Error reading dependency directory '", depdirpath,
                 "' for ", servicename, " service.");
     }
+
+    closedir(depdir);
 }
 
 // Check if one string starts with another