This issue was about passing unsigned argument where should be signed
number.
In reality this is about wrong usage of fseek and ftell to determine
filesize.
This patch is compliant to suggestions from FIO19-C:
"Do not use fseek() and ftell() to compute the size of a regular file"
Coverity issue: 143454
Fixes:
a92a5a2cbbff ("app/testpmd: add command for loading DDP")
Cc: stable@dpdk.org
Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
#include <inttypes.h>
#include <sys/queue.h>
#include <inttypes.h>
#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
#include <rte_common.h>
#include <rte_byteorder.h>
#include <rte_common.h>
#include <rte_byteorder.h>
uint8_t *
open_ddp_package_file(const char *file_path, uint32_t *size)
{
uint8_t *
open_ddp_package_file(const char *file_path, uint32_t *size)
{
- FILE *fh = fopen(file_path, "rb");
- uint32_t pkg_size;
+ int fd = open(file_path, O_RDONLY);
+ off_t pkg_size;
uint8_t *buf = NULL;
int ret = 0;
uint8_t *buf = NULL;
int ret = 0;
printf("%s: Failed to open %s\n", __func__, file_path);
return buf;
}
printf("%s: Failed to open %s\n", __func__, file_path);
return buf;
}
- ret = fseek(fh, 0, SEEK_END);
- if (ret < 0) {
- fclose(fh);
+ if ((fstat(fd, &st_buf) != 0) || (!S_ISREG(st_buf.st_mode))) {
+ close(fd);
printf("%s: File operations failed\n", __func__);
return buf;
}
printf("%s: File operations failed\n", __func__);
return buf;
}
+ pkg_size = st_buf.st_size;
+ if (pkg_size < 0) {
+ close(fd);
+ printf("%s: File operations failed\n", __func__);
+ return buf;
+ }
buf = (uint8_t *)malloc(pkg_size);
if (!buf) {
buf = (uint8_t *)malloc(pkg_size);
if (!buf) {
printf("%s: Failed to malloc memory\n", __func__);
return buf;
}
printf("%s: Failed to malloc memory\n", __func__);
return buf;
}
- ret = fseek(fh, 0, SEEK_SET);
+ ret = read(fd, buf, pkg_size);
- fclose(fh);
- printf("%s: File seek operation failed\n", __func__);
- close_ddp_package_file(buf);
- return NULL;
- }
-
- ret = fread(buf, 1, pkg_size, fh);
- if (ret < 0) {
- fclose(fh);
printf("%s: File read operation failed\n", __func__);
close_ddp_package_file(buf);
return NULL;
printf("%s: File read operation failed\n", __func__);
close_ddp_package_file(buf);
return NULL;
if (size)
*size = pkg_size;
if (size)
*size = pkg_size;