]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
plugins: close filedescriptors
authorHannes Reinecke <hare@suse.de>
Fri, 22 Apr 2022 10:31:40 +0000 (12:31 +0200)
committerHannes Reinecke <hare@suse.de>
Fri, 22 Apr 2022 10:31:40 +0000 (12:31 +0200)
For some reasons the plugin authors don't seem to believe in having
to close filedecriptors. Coverity, OTOH, does.
So fix them up to close filedescriptors after use.

Signed-off-by: Hannes Reinecke <hare@suse.de>
12 files changed:
plugins/dera/dera-nvme.c
plugins/intel/intel-nvme.c
plugins/memblaze/memblaze-nvme.c
plugins/micron/micron-nvme.c
plugins/ocp/ocp-nvme.c
plugins/scaleflux/sfx-nvme.c
plugins/seagate/seagate-nvme.c
plugins/shannon/shannon-nvme.c
plugins/toshiba/toshiba-nvme.c
plugins/transcend/transcend-nvme.c
plugins/wdc/wdc-nvme.c
plugins/ymtc/ymtc-nvme.c

index f36fc674a30cb9bebb1a9c3cdfcca19f55bfae68..62be80d11f9a90296dca0a539706e5b2e9b593a5 100644 (file)
@@ -204,6 +204,7 @@ exit:
        if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 
index 80d218c1c86c5cae17468351253d0ef634d6df96..2fae63bd6afbfa49d2969562a0d70c9f417d5593 100644 (file)
@@ -377,6 +377,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
        }
        else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -412,6 +413,7 @@ static int get_market_log(int argc, char **argv, struct command *cmd, struct plu
                        d_raw((unsigned char *)&log, sizeof(log));
        } else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -472,6 +474,7 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct
                        d_raw((unsigned char *)&stats, sizeof(stats));
        } else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -1502,7 +1505,10 @@ static int get_internal_log(int argc, char **argv, struct command *command,
                err = EIO;
        } else
                printf("Successfully wrote log to %s\n", cfg.file);
+       close(output);
+out_free:
        free(intel);
+       close(fd);
        return err;
 }
 
@@ -1597,6 +1603,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
                                fid, result);
                } else {
                        printf("Could not read feature id 0xE2.\n");
+                       close(fd);
                        return err;
                }
                break;
@@ -1617,6 +1624,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
                printf("%d not supported.\n", option);
                return EINVAL;
        }
+       close(fd);
        return fd;
 }
 
index c0f4d66375b0dff75cc557d088d10d828a8ab588..6ca442511600d2cedf28ce7dd12a91ca4a9e18c2 100644 (file)
@@ -467,6 +467,7 @@ static int mb_get_additional_smart_log(int argc, char **argv, struct command *cm
        if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 
@@ -517,6 +518,7 @@ static int mb_get_powermanager_status(int argc, char **argv, struct command *cmd
             nvme_select_to_string(0), result);
     } else if (err > 0)
            nvme_show_status(err);
+    close(fd);
     return err;
 }
 
@@ -574,6 +576,7 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd
     } else if (err > 0)
        nvme_show_status(err);
 
+    close(fd);
     return err;
 }
 
@@ -613,11 +616,13 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s
 
     if (parse_params(cfg.param, 2, &param1, &param2)) {
         printf("setfeature: invalid formats %s\n", cfg.param);
-        exit(EINVAL);
+        close(fd);
+        return EINVAL;
     }
     if ((param1 == 1) && (param2 < P2MIN || param2 > P2MAX)) {
         printf("setfeature: invalid high io latency threshold %d\n", param2);
-        exit(EINVAL);
+        close(fd);
+        return EINVAL;
     }
     cfg.value = (param1 << MB_FEAT_HIGH_LATENCY_VALUE_SHIFT) | param2;
 
@@ -646,6 +651,7 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s
     } else if (err > 0)
        nvme_show_status(err);
 
+    close(fd);
     return err;
 }
 
@@ -767,6 +773,7 @@ static int mb_high_latency_log_print(int argc, char **argv, struct command *cmd,
     }
 
     if (NULL != fdi) fclose(fdi);
+    close(fd);
     return err;
 }
 
@@ -852,23 +859,26 @@ static int mb_selective_download(int argc, char **argv, struct command *cmd, str
        if (err < 0) {
                perror("fstat");
                err = errno;
+               goto out_close;
        }
 
        fw_size = sb.st_size;
        if (fw_size & 0x3) {
                fprintf(stderr, "Invalid size:%d for f/w image\n", fw_size);
                err = EINVAL;
-               goto out;
+               goto out_close;
        }
 
        if (posix_memalign(&fw_buf, getpagesize(), fw_size)) {
                fprintf(stderr, "No memory for f/w size:%d\n", fw_size);
                err = ENOMEM;
-               goto out;
+               goto out_close;
        }
 
-       if (read(fw_fd, fw_buf, fw_size) != ((ssize_t)(fw_size)))
-               return EIO;
+       if (read(fw_fd, fw_buf, fw_size) != ((ssize_t)(fw_size))) {
+               err = errno;
+               goto out_free;
+       }
 
        while (fw_size > 0) {
                xfer = min(xfer, fw_size);
@@ -885,10 +895,10 @@ static int mb_selective_download(int argc, char **argv, struct command *cmd, str
                err = nvme_fw_download(&args);
                if (err < 0) {
                        perror("fw-download");
-                       goto out;
+                       goto out_free;
                } else if (err != 0) {
                        nvme_show_status(err);
-                       goto out;
+                       goto out_free;
                }
                fw_buf     += xfer;
                fw_size    -= xfer;
@@ -902,7 +912,12 @@ static int mb_selective_download(int argc, char **argv, struct command *cmd, str
                fprintf(stderr, "Update successful! Please power cycle for changes to take effect\n");
        }
 
+out_free:
+       free(fw_buf);
+out_close:
+       close(fw_fd);
 out:
+       close(fd);
        return err;
 }
 
@@ -1006,7 +1021,8 @@ int io_latency_histogram(char *file, char *buf, int print, int logid)
         fPRINT_PARAM1("Unsupported io latency histogram revision\n");
     }
 
-    fclose(fdi);
+    if (fdi)
+           fclose(fdi);
     return 1;
 }
 
@@ -1116,6 +1132,7 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd,
                printf("NVMe Status:%s(%x)\n", nvme_status_to_string(err), err);
        };
 */
+    close(fd);
     return err;
 }
 
@@ -1208,6 +1225,7 @@ static int mb_set_lat_stats(int argc, char **argv,
                                fid, result);
                } else {
                        printf("Could not read feature id 0xE2.\n");
+                       close(fd);
                        return err;
                }
                break;
@@ -1226,8 +1244,9 @@ static int mb_set_lat_stats(int argc, char **argv,
                break;
        default:
                printf("%d not supported.\n", option);
-               return EINVAL;
+               err = EINVAL;
        }
-       return fd;
+       close(fd);
+       return err;
 }
 
index d333c4c4fa61b9414c94ee4320741b1331350333..5e9ecb5676f85da92b81d26baf2da13f113e785a 100644 (file)
@@ -498,14 +498,13 @@ static int micron_selective_download(int argc, char **argv,
     };
 
     fd = parse_and_open(argc, argv, desc, opts);
-
     if (fd < 0)
         return fd;
 
     if (strlen(cfg.select) != 3) {
         fprintf(stderr, "Invalid select flag\n");
-        err = EINVAL;
-        goto out;
+        close(fd);
+        return EINVAL;
     }
 
     for (int i = 0; i < 3; i++) {
@@ -520,21 +519,22 @@ static int micron_selective_download(int argc, char **argv,
         selectNo = 26;
     } else {
         fprintf(stderr, "Invalid select flag\n");
-        err = EINVAL;
-        goto out;
+        close(fd);
+        return EINVAL;
     }
 
     fw_fd = open(cfg.fw, O_RDONLY);
     if (fw_fd < 0) {
         fprintf(stderr, "no firmware file provided\n");
-        err = EINVAL;
-        goto out;
+        close(fd);
+        return EINVAL;
     }
 
     err = fstat(fw_fd, &sb);
     if (err < 0) {
         perror("fstat");
         err = errno;
+        goto out;
     }
 
     fw_size = sb.st_size;
@@ -550,8 +550,10 @@ static int micron_selective_download(int argc, char **argv,
         goto out;
     }
 
-    if (read(fw_fd, fw_buf, fw_size) != ((ssize_t) (fw_size)))
-        return EIO;
+    if (read(fw_fd, fw_buf, fw_size) != ((ssize_t) (fw_size))) {
+       err = errno;
+       goto out_free;
+    }
 
     while (fw_size > 0) {
         xfer = min(xfer, fw_size);
@@ -568,10 +570,10 @@ static int micron_selective_download(int argc, char **argv,
         err = nvme_fw_download(&args);
         if (err < 0) {
             perror("fw-download");
-            goto out;
+            goto out_free;
         } else if (err != 0) {
            nvme_show_status(err);
-            goto out;
+            goto out_free;
         }
         fw_buf += xfer;
         fw_size -= xfer;
@@ -586,7 +588,11 @@ static int micron_selective_download(int argc, char **argv,
                 "Update successful! Power cycle for changes to take effect\n");
     }
 
+out_free:
+    free(fw_buf);
 out:
+    close(fw_fd);
+    close(fd);
     return err;
 }
 
@@ -754,6 +760,7 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd,
             }
         }
     }
+    close(fd);
     return err;
 }
 
@@ -823,7 +830,6 @@ static int micron_pcie_stats(int argc, char **argv,
     sscanf(argv[optind], "/dev/nvme%d", &ctrlIdx);
     if ((eModel = GetDriveModel(ctrlIdx)) == UNKNOWN_MODEL) {
         printf ("Unsupported drive model for vs-pcie-stats command\n");
-        close(fd);
         goto out;
     }
 
@@ -868,6 +874,7 @@ static int micron_pcie_stats(int argc, char **argv,
     res = fgets(correctable, sizeof(correctable), fp);
     if (res == NULL) {
         printf("Failed to retrieve error count\n");
+        pclose(fp);
         goto out;
     }
     pclose(fp);
@@ -882,6 +889,7 @@ static int micron_pcie_stats(int argc, char **argv,
     res = fgets(uncorrectable, sizeof(uncorrectable), fp);
     if (res == NULL) {
         printf("Failed to retrieve error count\n");
+        pclose(fp);
         goto out;
     }
     pclose(fp);
@@ -924,6 +932,7 @@ static int micron_pcie_stats(int argc, char **argv,
     }
 
 out:
+    close(fd);
     return err;
 }
 
@@ -1019,6 +1028,7 @@ static int micron_clear_pcie_correctable_errors(int argc, char **argv,
     res = fgets(correctable, sizeof(correctable), fp);
     if (res == NULL) {
         printf("Failed to retrieve error count\n");
+        pclose(fp);
         goto out;
     }
     pclose(fp);
@@ -1026,8 +1036,7 @@ static int micron_clear_pcie_correctable_errors(int argc, char **argv,
     printf("Device correctable errors detected: %s\n", correctable);
     err = 0;
 out:
-    if (fd > 0)
-        close(fd);
+    close(fd);
     return err;
 }
 
@@ -1929,6 +1938,7 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
 
     if (model == UNKNOWN_MODEL) {
         fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd");
+        close(fd);
         return -1;
     }
 
@@ -1943,12 +1953,14 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
         err = nvme_submit_admin_passthru(fd, &admin_cmd, NULL);
         if (err) {
             fprintf(stderr, "ERROR : drive-info opcode failed with 0x%x\n", err);
+            close(fd);
             return -1;
         }
     } else {
         err = nvme_identify_ctrl(fd, &ctrl);
         if (err) {
             fprintf(stderr, "ERROR : identify_ctrl() failed with 0x%x\n", err);
+            close(fd);
             return -1;
         }
         dinfo.hw_ver_major = ctrl.vs[820];
@@ -1991,6 +2003,7 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
         }
     }
 
+    close(fd);
     return 0;
 }
 
@@ -2200,8 +2213,7 @@ static int micron_fw_activation_history(int argc, char **argv, struct command *c
         }
     }
 out:
-    if (fd > 0)
-        close(fd);
+    close(fd);
     return err;
 }
 
@@ -2254,6 +2266,7 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd
         enable = 0;
     } else if (strcmp(opt.option, "status")) {
         printf("Invalid control option %s specified\n", opt.option);
+        close(fd);
         return -1;
     }
 
@@ -2274,6 +2287,7 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd
     err = nvme_get_features(&g_args);
     if (err != 0) {
         printf("Failed to retrieve latency monitoring feature status\n");
+        close(fd);
        return err;
     }
 
@@ -2298,6 +2312,7 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd
         } else if (result == 0) {
                printf("\n");
         }
+        close(fd);
         return err;
     }
 
@@ -2305,11 +2320,13 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd
     if (enable == 1) {
         if (opt.threshold > 2550) {
             printf("The maximum threshold value cannot be more than 2550 ms\n");
+            close(fd);
             return -1;
         }
        /* timing mask is in terms of 10ms units, so min allowed is 10ms */
        else if ((opt.threshold % 10) != 0) {
             printf("The threshold value should be multiple of 10 ms\n");
+            close(fd);
             return -1;
        }
        opt.threshold /= 10;
@@ -2328,6 +2345,7 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd
     } else if (strcmp(opt.command, "all")) {
         printf("Invalid command %s specified for option %s\n",
                opt.command, opt.option);
+        close(fd);
         return -1;
     }
 
@@ -2411,6 +2429,7 @@ static int micron_latency_stats_logs(int argc, char **argv, struct command *cmd,
     if (err) {
         if (err < 0)
             printf("Unable to retrieve latency stats log the drive\n");
+        close(fd);
         return err;
     }
     /* print header and each log entry */
@@ -2424,6 +2443,7 @@ static int micron_latency_stats_logs(int argc, char **argv, struct command *cmd,
               log[i].deac, log[i].prinfo, log[i].fua, log[i].lr);
     }
     printf("\n");
+    close(fd);
     return err;
 }
 
@@ -2489,6 +2509,7 @@ static int micron_latency_stats_info(int argc, char **argv, struct command *cmd,
        cmd_str = "Trim";
     } else if (strcmp(opt.command, "all")) {
         printf("Invalid command option %s to display latency stats\n", opt.command);
+       close(fd);
        return -1;
     }
 
@@ -2497,6 +2518,7 @@ static int micron_latency_stats_info(int argc, char **argv, struct command *cmd,
     if (err) {
         if (err < 0)
             printf("Unable to retrieve latency stats log the drive\n");
+        close(fd);
         return err;
     }
     printf("Micron IO %s Command Latency Statistics\n"
@@ -2518,6 +2540,7 @@ static int micron_latency_stats_info(int argc, char **argv, struct command *cmd,
        printf("%2d   %8s    %8s    %8"PRIu64"\n",
               bucket, start, end, cmd_stats[b]);
     }
+    close(fd);
     return err;
 }
 
@@ -2615,6 +2638,7 @@ static int micron_clr_fw_activation_history(int argc, char **argv,
 
     err = nvme_set_features_simple(fd, fid, 1, 0, 0, &result);
     if (err == 0) err = (int)result;
+    close(fd);
     return err;
 }
 
@@ -2824,7 +2848,7 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
     fd = parse_and_open(argc, argv, desc, opts);
 
     if (fd < 0)
-        goto out;
+        return fd;
 
     /* if telemetry type is specified, check for data area */
     if (strlen(cfg.type) != 0) {
@@ -2832,19 +2856,16 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
             cfg.log = 0x08;
         } else if (strcmp(cfg.type, "host")) {
             printf ("telemetry type (host or controller) should be specified i.e. -t=host\n");
-            close(fd);
             goto out;
         }
 
         if (cfg.data_area <= 0 || cfg.data_area > 3) {
             printf ("data area must be selected using -d option ie --d=1,2,3\n");
-            close(fd);
             goto out;
         }
         telemetry_option = 1;
     } else if (cfg.data_area > 0) {
         printf ("data area option is valid only for telemetry option (i.e --type=host|controller)\n");
-        close(fd);
         goto out;
     }
 
@@ -2860,7 +2881,6 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
     sscanf(argv[optind], "/dev/nvme%d", &ctrlIdx);
     if ((eModel = GetDriveModel(ctrlIdx)) == UNKNOWN_MODEL) {
         printf ("Unsupported drive model for vs-internal-log collection\n");
-        close(fd);
         goto out;
     }
 
@@ -2882,7 +2902,6 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
             WriteData(buffer, logSize, dir, cfg.package, msg);
             free(buffer);
         }
-        close(fd);
         goto out;
     }
 
@@ -3002,5 +3021,6 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
 
     err = ZipAndRemoveDir(strMainDirName, cfg.package);
 out:
+    close(fd);
     return err;
 }
index 6b7fc9d41280dee3018bd6f527b4337c3ac8cd54..faac09d7faa7681dd4047ac09e8485e4dea4f3e5 100644 (file)
@@ -430,7 +430,7 @@ static int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
         if (ret)
                 fprintf(stderr, "ERROR : OCP : Failure reading the C0 Log Page, ret = %d\n",
                         ret);
-
+        close(fd);
         return ret;
 }
 
@@ -783,6 +783,6 @@ static int ocp_latency_monitor_log(int argc, char **argv, struct command *comman
                 fprintf(stderr,
                         "ERROR : OCP : Failure reading the C3 Log Page, ret = %d\n",
                         ret);
-
+        close(fd);
         return ret;
 }
index a6aaad5fa44550af8af0eb47a7a87de6d243f184..a277eceb51a5540c1c64adb2fd9fb6a77a13ead7 100644 (file)
@@ -355,6 +355,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0) {
+               return fd;
+       }
 
        err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id,
                sizeof(smart_log), (void *)&smart_log);
@@ -368,6 +371,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
        }
        else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -436,6 +440,9 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0) {
+               return fd;
+       }
 
        err = nvme_get_log_simple(fd, cfg.write ? 0xc3 : 0xc1, sizeof(stats), (void *)&stats);
        if (!err) {
@@ -445,6 +452,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
                        d_raw((unsigned char *)&stats, sizeof(stats));
        } else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -560,7 +568,6 @@ static int sfx_get_bad_block(int argc, char **argv, struct command *cmd, struct
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
-
        if (fd < 0) {
                return fd;
        }
@@ -568,6 +575,7 @@ static int sfx_get_bad_block(int argc, char **argv, struct command *cmd, struct
        data_buf = malloc(buf_size);
        if (!data_buf) {
                fprintf(stderr, "malloc fail, errno %d\r\n", errno);
+               close(fd);
                return -1;
        }
 
@@ -582,6 +590,7 @@ static int sfx_get_bad_block(int argc, char **argv, struct command *cmd, struct
        }
 
        free(data_buf);
+       close(fd);
        return 0;
 }
 
@@ -625,10 +634,12 @@ static int query_cap_info(int argc, char **argv, struct command *cmd, struct plu
 
        if (ioctl(fd, SFX_GET_FREESPACE, &ctx)) {
                fprintf(stderr, "vu ioctl fail, errno %d\r\n", errno);
+               close(fd);
                return -1;
        }
 
        show_cap_info(&ctx);
+       close(fd);
        return err;
 }
 
@@ -770,10 +781,12 @@ static int change_cap(int argc, char **argv, struct command *cmd, struct plugin
 
        if (change_sanity_check(fd, cap_in_4k, &shrink)) {
                printf("ScaleFlux change-capacity: fail\n");
+               close(fd);
                return err;
        }
 
        if (!cfg.force && shrink && !sfx_confirm_change("Changing Cap may irrevocably delete this device's data")) {
+               close(fd);
                return 0;
        }
 
@@ -786,6 +799,7 @@ static int change_cap(int argc, char **argv, struct command *cmd, struct plugin
                printf("ScaleFlux change-capacity: success\n");
                ioctl(fd, BLKRRPART);
        }
+       close(fd);
        return err;
 }
 
@@ -877,12 +891,14 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
 
        if (!cfg.feature_id) {
                fprintf(stderr, "feature-id required param\n");
+               close(fd);
                return EINVAL;
        }
 
        if (cfg.feature_id == SFX_FEAT_CLR_CARD) {
                /*Warning for clean card*/
                if (!cfg.force && !sfx_confirm_change("Going to clean device's data, confirm umount fs and try again")) {
+                       close(fd);
                        return 0;
                } else {
                        return sfx_clean_card(fd);
@@ -898,6 +914,7 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
                                        perror("identify-namespace");
                                else
                                        nvme_show_status(err);
+                               close(fd);
                                return err;
                        }
                        /*
@@ -905,17 +922,20 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
                         */
                        if ((ns.flbas & 0xf) != 1) {
                                printf("Please change-sector size to 4K, then retry\n");
+                               close(fd);
                                return EFAULT;
                        }
                }
        } else if (cfg.feature_id == SFX_FEAT_UP_P_CAP) {
                if (cfg.value <= 0) {
                        fprintf(stderr, "Invalid Param\n");
+                       close(fd);
                        return EINVAL;
                }
 
                /*Warning for change pacp by GB*/
                if (!cfg.force && !sfx_confirm_change("Changing physical capacity may irrevocably delete this device's data")) {
+                       close(fd);
                        return 0;
                }
        }
@@ -924,6 +944,7 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
 
        if (err < 0) {
                perror("ScaleFlux-set-feature");
+               close(fd);
                return errno;
        } else if (!err) {
                printf("ScaleFlux set-feature:%#02x (%s), value:%d\n", cfg.feature_id,
@@ -931,6 +952,7 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
        } else if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 
@@ -959,19 +981,20 @@ static int sfx_get_feature(int argc, char **argv, struct command *cmd, struct pl
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
-
        if (fd < 0) {
                return fd;
        }
 
        if (!cfg.feature_id) {
                fprintf(stderr, "feature-id required param\n");
+               close(fd);
                return EINVAL;
        }
 
        err = nvme_sfx_get_features(fd, cfg.namespace_id, cfg.feature_id, &result);
        if (err < 0) {
                perror("ScaleFlux-get-feature");
+               close(fd);
                return errno;
        } else if (!err) {
                printf("ScaleFlux get-feature:%02x (%s), value:%d\n", cfg.feature_id,
@@ -979,6 +1002,7 @@ static int sfx_get_feature(int argc, char **argv, struct command *cmd, struct pl
        } else if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 
 }
index 5f6ce90b0ffcc5b65020bd61fe973377672f6714..0d9fdeb2c353b5cb6d7b45a194d549de8c4daf4e 100644 (file)
@@ -174,6 +174,8 @@ static int log_pages_supp(int argc, char **argv, struct command *cmd,
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0)
+               return fd;
        err = nvme_get_log_simple(fd, 0xc5, sizeof(logPageMap), &logPageMap);
        if (!err) {
                if (strcmp(cfg.output_format,"json")) {
@@ -199,6 +201,7 @@ static int log_pages_supp(int argc, char **argv, struct command *cmd,
 
        if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -732,6 +735,11 @@ static int vs_smart_log(int argc, char **argv, struct command *cmd, struct plugi
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0) {
+               printf ("\nDevice not found \n");
+               return -1;
+       }
+
        if (strcmp(cfg.output_format,"json"))
                printf("Seagate Extended SMART Information :\n");
 
@@ -774,6 +782,7 @@ static int vs_smart_log(int argc, char **argv, struct command *cmd, struct plugi
        } else if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 
@@ -889,6 +898,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
        if(!strcmp(cfg.output_format,"json"))
                json_temp_stats(temperature, PcbTemp, SocTemp, maxTemperature, MaxSocTemp, cf_err, scCurrentTemp, scMaxTemp);
 
+       close(fd);
        return err;
 }
 /* EOF Temperature Stats information */
@@ -1000,6 +1010,11 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0) {
+               printf ("\nDevice not found \n");;
+               return -1;
+       }
+
        if(strcmp(cfg.output_format,"json"))
                printf("Seagate PCIe error counters Information :\n");
 
@@ -1013,6 +1028,7 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct
        } else if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 /* EOF PCIE error-log information */
@@ -1038,14 +1054,18 @@ static int vs_clr_pcie_correctable_errs(int argc, char **argv, struct command *c
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0) {
+               printf ("\nDevice not found \n");;
+               return -1;
+       }
 
        err = nvme_set_features_simple(fd, 0xE1, 0, 0xCB, cfg.save, &result);
 
        if (err < 0) {
                perror("set-feature");
-               return errno;
        }
 
+       close(fd);
        return err;
 
 }
@@ -1164,6 +1184,7 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug
                free(log);
        }
 
+       close(fd);
        return err;
 }
 
@@ -1275,8 +1296,9 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug
 
                free(log);
        }
-       return err;
 
+       close(fd);
+       return err;
 }
 
 void seaget_d_raw(unsigned char *buf, int len, int fd)
@@ -1334,6 +1356,7 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl
                dump_fd = open(cfg.file, flags, mode);
                if (dump_fd < 0) {
                        perror(cfg.file);
+                       close(fd);
                        return EINVAL;
                }
        }
@@ -1405,10 +1428,11 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl
 
                free(log);
        }
-
+out:
        if(strlen(cfg.file))
                close(dump_fd);
 
+       close(fd);
        return err;
 }
 
index d79b119d55ccc6e7f918694255db62765c827cd3..27ea10207061bd583a30e5353f4b90584e6cef10 100644 (file)
@@ -137,6 +137,8 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
        };
 
        fd = parse_and_open(argc, argv, desc, opts);
+       if (fd < 0)
+               return fd;
        err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id,
                   sizeof(smart_log), &smart_log);
        if (!err) {
@@ -147,6 +149,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
        }
        else if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
index fd2e9c1e432a4acebea48e2a2dc233308e7d8ebc..f16b44faa9b76151f0810bef0dc25c833a56e21c 100644 (file)
@@ -474,6 +474,7 @@ static int vendor_log(int argc, char **argv, struct command *cmd, struct plugin
 end:
        if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
 
@@ -517,6 +518,7 @@ static int internal_log(int argc, char **argv, struct command *cmd, struct plugi
        if (err > 0)
                nvme_show_status(err);
 
+       close(fd);
        return err;
 }
 
@@ -569,5 +571,6 @@ static int clear_correctable_errors(int argc, char **argv, struct command *cmd,
 end:
        if (err > 0)
                nvme_show_status(err);
+       close(fd);
        return err;
 }
index 85d3cac9ad9ac4f170ef6061c45c17ba65ee9bdd..34ea3005d6653d168966a77798117513a56a4c02 100644 (file)
@@ -49,7 +49,7 @@ static int getHealthValue(int argc, char **argv, struct command *cmd, struct plu
                }
                         
        }
-
+       close(fd);
        return result;
 }
 
@@ -83,6 +83,6 @@ static int getBadblock(int argc, char **argv, struct command *cmd, struct plugin
                int badblock  = data[0];
                printf("Transcend NVME badblock count: %d\n",badblock);
        }
-
+       close(fd);
        return result;
 }
index e955ce6df39150195575e2c10352ac401401e0b7..b9f7d3fd06a6d3465ba1ff0bfd1bb44a23ad002d 100644 (file)
@@ -3393,6 +3393,7 @@ static int wdc_crash_dump(int fd, char *file, int type)
 {
        char f[PATH_MAX] = {0};
        const char *dump_type;
+       int ret;
 
        if (file != NULL) {
                strncpy(f, file, PATH_MAX - 1);
@@ -3403,11 +3404,13 @@ static int wdc_crash_dump(int fd, char *file, int type)
        else
                dump_type = "_crash_dump";
 
-       if (wdc_get_serial_name(fd, f, PATH_MAX, dump_type) == -1) {
+       ret = wdc_get_serial_name(fd, f, PATH_MAX, dump_type);
+       if (ret)
                fprintf(stderr, "ERROR : WDC : failed to generate file name\n");
-               return -1;
-       }
-       return wdc_do_crash_dump(fd, f, type);
+       else
+               ret = wdc_do_crash_dump(fd, f, type);   \
+       close(fd);
+       return ret;
 }
 
 static int wdc_do_drive_log(int fd, char *file)
@@ -3481,6 +3484,7 @@ static int wdc_drive_log(int argc, char **argv, struct command *command,
 
        if (!wdc_check_device(r, fd)) {
                nvme_free_tree(r);
+               close(fd);
                return -1;
        }
        capabilities = wdc_get_drive_capabilities(r, fd);
@@ -3492,14 +3496,14 @@ static int wdc_drive_log(int argc, char **argv, struct command *command,
                if (cfg.file != NULL) {
                        strncpy(f, cfg.file, PATH_MAX - 1);
                }
-               if (wdc_get_serial_name(fd, f, PATH_MAX, "drive_log") == -1) {
+               ret = wdc_get_serial_name(fd, f, PATH_MAX, "drive_log");
+               if (ret)
                        fprintf(stderr, "ERROR : WDC : failed to generate file name\n");
-                       nvme_free_tree(r);
-                       return -1;
-               }
-               ret = wdc_do_drive_log(fd, f);
+               else
+                       ret = wdc_do_drive_log(fd, f);
        }
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -3533,6 +3537,7 @@ static int wdc_get_crash_dump(int argc, char **argv, struct command *command,
 
        if (!wdc_check_device(r, fd)) {
                nvme_free_tree(r);
+               close(fd);
                return -1;
 
        }
@@ -3549,6 +3554,7 @@ static int wdc_get_crash_dump(int argc, char **argv, struct command *command,
                }
        }
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -3582,6 +3588,7 @@ static int wdc_get_pfail_dump(int argc, char **argv, struct command *command,
 
        if (!wdc_check_device(r, fd)) {
                nvme_free_tree(r);
+               close(fd);
                return -1;
        }
 
@@ -3596,6 +3603,7 @@ static int wdc_get_pfail_dump(int argc, char **argv, struct command *command,
                }
        }
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -3669,6 +3677,7 @@ static int wdc_purge(int argc, char **argv,
 
        if (!wdc_check_device(r, fd)) {
                nvme_free_tree(r);
+               close(fd);
                return -1;
        }
 
@@ -3700,6 +3709,7 @@ static int wdc_purge(int argc, char **argv,
                nvme_show_status(ret);
        }
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -3726,6 +3736,7 @@ static int wdc_purge_monitor(int argc, char **argv,
        r = nvme_scan(NULL);
        if (!wdc_check_device(r, fd)) {
                nvme_free_tree(r);
+               close(fd);
                return -1;
        }
 
@@ -3758,6 +3769,7 @@ static int wdc_purge_monitor(int argc, char **argv,
                nvme_show_status(ret);
        }
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -4350,7 +4362,7 @@ static void wdc_print_bd_ca_log_normal(void *data)
        __u8  *byte_raw;
 
        if (bd_data->field_id == 0x00) {
-               raw = (__u64*)&bd_data->raw_value[1];
+               raw = (__u64*)&bd_data->raw_value[0];
                printf("Additional Smart Log for NVME device:%s namespace-id:%x\n",
                        devicename, WDC_DE_GLOBAL_NSID);
                printf("key                               normalized raw\n");
@@ -7072,6 +7084,7 @@ static int wdc_vs_smart_add_log(int argc, char **argv, struct command *command,
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7135,13 +7148,14 @@ static int wdc_vs_cloud_log(int argc, char **argv, struct command *command,
        } else {
                fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page V1 data\n");
                ret = -1;
-               goto out;
        }
 
        if (data)
                free(data);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7216,7 +7230,6 @@ static int wdc_vs_hw_rev_log(int argc, char **argv, struct command *command,
        } else {
                fprintf(stderr, "ERROR : WDC : Unable to read Hardware Revision Log Page data\n");
                ret = -1;
-               goto out;
        }
 
 free_buf:
@@ -7224,6 +7237,8 @@ free_buf:
                free(data);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7267,6 +7282,8 @@ static int wdc_get_latency_monitor_log(int argc, char **argv, struct command *co
                fprintf(stderr, "ERROR : WDC : Failure reading the Latency Monitor (C3) Log Page, ret = %d\n", ret);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7310,6 +7327,8 @@ static int wdc_get_error_recovery_log(int argc, char **argv, struct command *com
                fprintf(stderr, "ERROR : WDC : Failure reading the Error Recovery (C1) Log Page, ret = 0x%x\n", ret);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7353,6 +7372,8 @@ static int wdc_get_dev_capabilities_log(int argc, char **argv, struct command *c
                fprintf(stderr, "ERROR : WDC : Failure reading the Device Capabilities (C4) Log Page, ret = 0x%x\n", ret);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7396,6 +7417,8 @@ static int wdc_get_unsupported_reqs_log(int argc, char **argv, struct command *c
                fprintf(stderr, "ERROR : WDC : Failure reading the Unsupported Requirements (C5) Log Page, ret = 0x%x\n", ret);
 
 out:
+       nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7481,6 +7504,7 @@ static int wdc_clear_pcie_correctable_errors(int argc, char **argv, struct comma
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7598,6 +7622,7 @@ static int wdc_drive_status(int argc, char **argv, struct command *command,
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7648,6 +7673,7 @@ static int wdc_clear_assert_dump(int argc, char **argv, struct command *command,
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7835,7 +7861,8 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com
                /* to retrieve fw activate history data                                          */
                if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN)) == NULL) {
                        fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno));
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
 
                /* Get the 0xC0 log data */
@@ -7888,6 +7915,7 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com
                fprintf(stderr, "ERROR : WDC : Failure reading the FW Activate History, ret = %d\n", ret);
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -7945,15 +7973,14 @@ static int wdc_clear_fw_activate_history(int argc, char **argv, struct command *
                goto out;
        }
 
-       if (capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY) {
+       if (capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY)
                ret = wdc_do_clear_fw_activate_history_vuc(fd);
-       }
-       else {
+       else
                ret = wdc_do_clear_fw_activate_history_fid(fd);
-       }
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -8044,6 +8071,7 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -8180,7 +8208,7 @@ static int wdc_get_log_dir_max_entries(int fd, __u32* maxNumOfEntries)
        {
                fprintf(stderr, "ERROR : WDC : %s: Failed to get headerPayloadSize from file directory 0x%x\n",
                                __func__, ret);
-               goto end;
+               return ret;
        }
 
        fileIdOffsetsBufferSize = WDC_DE_FILE_HEADER_SIZE + (headerPayloadSize * WDC_DE_FILE_OFFSET_SIZE);
@@ -8202,9 +8230,8 @@ static int wdc_get_log_dir_max_entries(int fd, __u32* maxNumOfEntries)
                        continue;
                (*maxNumOfEntries)++;
        }
-       end:
-       if (!fileIdOffsetsBuffer)
-               free(fileIdOffsetsBuffer);
+end:
+       free(fileIdOffsetsBuffer);
        return ret;
 }
 
@@ -8758,7 +8785,7 @@ static int wdc_drive_essentials(int argc, char **argv, struct command *command,
        char d[PATH_MAX] = {0};
        char k[PATH_MAX] = {0};
        char *d_ptr;
-       int fd;
+       int fd, ret;
        nvme_root_t r;
        __u64 capabilities = 0;
 
@@ -8784,8 +8811,8 @@ static int wdc_drive_essentials(int argc, char **argv, struct command *command,
        capabilities = wdc_get_drive_capabilities(r, fd);
        if ((capabilities & WDC_DRIVE_CAP_DRIVE_ESSENTIALS) != WDC_DRIVE_CAP_DRIVE_ESSENTIALS) {
                fprintf(stderr, "ERROR : WDC: unsupported device for this command\n");
-               nvme_free_tree(r);
-               return -1;
+               ret = -1;
+               goto out;
        }
 
        if (cfg.dirName != NULL) {
@@ -8795,7 +8822,11 @@ static int wdc_drive_essentials(int argc, char **argv, struct command *command,
                d_ptr = NULL;
        }
 
-       return wdc_do_drive_essentials(r, fd, d_ptr, k);
+       ret = wdc_do_drive_essentials(r, fd, d_ptr, k);
+out:
+       nvme_free_tree(r);
+       close(fd);
+       return ret;
 }
 
 static int wdc_do_drive_resize(int fd, uint64_t new_size)
@@ -8886,6 +8917,7 @@ static int wdc_drive_resize(int argc, char **argv,
 
        nvme_show_status(ret);
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -8925,6 +8957,7 @@ static int wdc_namespace_resize(int argc, char **argv,
                (cfg.op_option != 0xF))
        {
                fprintf(stderr, "ERROR : WDC: unsupported OP option parameter\n");
+               close(fd);
                return -1;
        }
 
@@ -8943,6 +8976,7 @@ static int wdc_namespace_resize(int argc, char **argv,
 
        nvme_show_status(ret);
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -9115,6 +9149,7 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command
        ret = validate_output_format(cfg.output_format);
        if (ret < 0) {
                fprintf(stderr, "%s: ERROR : WDC : invalid output format\n", __func__);
+               close(fd);
                return ret;
        }
        ret = 0;
@@ -9173,6 +9208,7 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command
 
  out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -9815,6 +9851,7 @@ static int wdc_vs_nand_stats(int argc, char **argv, struct command *command,
                fprintf(stderr, "ERROR : WDC : Failure reading NAND statistics, ret = %d\n", ret);
 
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -9910,6 +9947,7 @@ static int wdc_vs_pcie_stats(int argc, char **argv, struct command *command,
 
 out:
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -9955,6 +9993,7 @@ static int wdc_vs_drive_info(int argc, char **argv,
        fmt = validate_output_format(cfg.output_format);
        if (fmt < 0) {
                fprintf(stderr, "ERROR : WDC %s invalid output format\n", __func__);
+               close(fd);
                return fmt;
        }
 
@@ -9963,6 +10002,7 @@ static int wdc_vs_drive_info(int argc, char **argv,
 
        if (ret) {
                fprintf(stderr, "ERROR : WDC %s: Identify Controller failed\n", __func__);
+               close(fd);
                return ret;
        }
 
@@ -9974,7 +10014,7 @@ static int wdc_vs_drive_info(int argc, char **argv,
                if (ret < 0)
                {
                        fprintf(stderr, "ERROR : WDC: %s: failure to get pci ids, ret = %d\n", __func__, ret);
-                       return -1;
+                       goto out;
                }
 
                switch (read_device_id) {
@@ -10120,6 +10160,7 @@ static int wdc_vs_drive_info(int argc, char **argv,
 out:
        nvme_show_status(ret);
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -10158,7 +10199,7 @@ static int wdc_vs_temperature_stats(int argc, char **argv,
        if (fmt < 0) {
                fprintf(stderr, "ERROR : WDC : invalid output format\n");
                ret = fmt;
-               goto END;
+               goto out;
        }
 
        /* check if command is supported */
@@ -10166,17 +10207,17 @@ static int wdc_vs_temperature_stats(int argc, char **argv,
        capabilities = wdc_get_drive_capabilities(r, fd);
        if ((capabilities & WDC_DRIVE_CAP_TEMP_STATS) != WDC_DRIVE_CAP_TEMP_STATS) {
                fprintf(stderr, "ERROR : WDC: unsupported device for this command\n");
-               nvme_free_tree(r);
-               return -1;
+               ret = -1;
+               goto out;
        } 
 
        /* get the temperature stats or report errors */
        ret = nvme_identify_ctrl(fd, &id_ctrl);
        if (ret != 0)
-               goto END;
+               goto out;
        ret = nvme_get_log_smart(fd, NVME_NSID_ALL, false, &smart_log);
        if (ret != 0)
-               goto END;
+               goto out;
 
        /* convert from Kelvin to degrees Celsius */
        temperature = ((smart_log.temperature[1] << 8) | smart_log.temperature[0]) - 273;
@@ -10233,9 +10274,10 @@ static int wdc_vs_temperature_stats(int argc, char **argv,
        else
                printf("%s: Invalid format\n", __func__);
 
-END:
+out:
        nvme_show_status(ret);
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -10338,6 +10380,7 @@ static int wdc_capabilities(int argc, char **argv,
             capabilities & WDC_DRIVE_CAP_HW_REV_LOG_PAGE ? "Supported" : "Not Supported");
    printf("capabilities                  : Supported\n");
     nvme_free_tree(r);
+    close(fd);
     return 0;
 }
 
@@ -10370,6 +10413,7 @@ static int wdc_cloud_ssd_plugin_version(int argc, char **argv,
        }
 
        nvme_free_tree(r);
+       close(fd);
        return 0;
 }
 
@@ -10428,6 +10472,7 @@ static int wdc_cloud_boot_SSD_version(int argc, char **argv,
        }
 
        nvme_free_tree(r);
+       close(fd);
        return ret;
 }
 
@@ -10442,7 +10487,7 @@ static int wdc_enc_get_log(int argc, char **argv, struct command *command,
        int xfer_size = 0;
        int fd;
        int len;
-       int err;
+       int err = 0;
 
        struct config {
                char  *file;
@@ -10463,7 +10508,7 @@ static int wdc_enc_get_log(int argc, char **argv, struct command *command,
                OPT_END()
        };
 
-       err = fd = parse_and_open(argc, argv, desc, opts);
+       fd = parse_and_open(argc, argv, desc, opts);
        if (fd < 0) {
                goto ret;
        }
@@ -10618,9 +10663,9 @@ static int wdc_enc_submit_move_data(int fd, char *cmd, int len, int xfer_size, F
                                }
                        }
                } while (more);
-                       free(buf);
        }
 
+       free(buf);
        return err;
 }
 
index dd5f00456d0ee16a4fbb874da66ff88294e9f2be..5abc1939979c69a214345460c7dd49b832f4121d 100644 (file)
@@ -140,5 +140,6 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
     if (err > 0)
         nvme_show_status(err);
 
+    close(fd);
     return err;
 }