audiod: Fix some memory leaks in the com_stat() error paths.
[paraslash.git] / audiod_command.c
index 3467dbe1a1990c566b353c7450a828828996bdbc..5bd511df7693a1c6713b2c95917791a1a72d2d39 100644 (file)
@@ -166,59 +166,61 @@ int com_kill(int fd, int argc, char **argv)
        return ret;
 }
 
-int com_stat(int fd, __a_unused int argc, __a_unused char **argv)
+int com_stat(int fd, int argc, char **argv)
 {
        int i, ret;
        char *buf = NULL;
-       long unsigned mask = ~0LU;
+       uint64_t mask = 0;
+       const uint64_t one = 1;
 
        if (argc > 1) {
-               mask = 0;
                for (i = 1; i < argc; i++) {
                        ret = stat_item_valid(argv[i]);
                        if (ret < 0)
                                return ret;
-                       mask |= (1 << ret);
+                       mask |= (one << ret);
                }
-       }
-       PARA_INFO_LOG("mask: 0x%lx\n", mask);
-       if (mask & (1 << SI_PLAY_TIME)) {
+       } else
+               mask--; /* set all bits */
+       PARA_INFO_LOG("mask: 0x%llx\n", (long long unsigned)mask);
+       if (mask & (one << SI_PLAY_TIME)) {
                int slot_num = get_play_time_slot_num();
                char *ts = get_time_string(slot_num);
                if (ts) {
+                       PARA_ERROR_LOG("play time: %s\n", ts);
                        ret = client_write(fd, ts);
+                       free(ts);
                        if (ret < 0)
                                goto out;
-                       free(ts);
                }
        }
-       if (mask & (1 << SI_AUDIOD_UPTIME)) {
+       if (mask & (one << SI_AUDIOD_UPTIME)) {
                char *tmp, *us = uptime_str();
                tmp = make_message("%s: %s\n",
                        status_item_list[SI_AUDIOD_UPTIME], us);
                free(us);
                ret = client_write(fd, tmp);
+               free(tmp);
                if (ret < 0)
                        goto out;
-               free(tmp);
        }
-       if (mask & (1 << SI_AUDIOD_STATUS)) {
+       if (mask & (one << SI_AUDIOD_STATUS)) {
                char *s = audiod_status_string();
                ret = client_write(fd, s);
+               free(s);
                if (ret < 0)
                        goto out;
-               free(s);
        }
-       if (mask & (1 << SI_DECODER_FLAGS)) {
+       if (mask & (one << SI_DECODER_FLAGS)) {
                char *df = decoder_flags();
                ret = client_write(fd, df);
+               free(df);
                if (ret < 0)
                        goto out;
-               free(df);
        }
        FOR_EACH_STATUS_ITEM(i) {
                char *tmp, *v;
-               if (!((1 << i) & mask))
+               if (!((one << i) & mask))
                        continue;
                v = stat_item_values[i];
                tmp = make_message("%s%s%s", buf? buf: "",