mem: fix potential underflow on mem size calculation
[dpdk.git] / lib / librte_eal / common / eal_common_fbarray.c
index 9d9d67d..019f84c 100644 (file)
@@ -355,7 +355,7 @@ find_contig(const struct rte_fbarray *arr, unsigned int start, bool used)
 static int
 set_used(struct rte_fbarray *arr, unsigned int idx, bool used)
 {
-       struct used_mask *msk = get_used_mask(arr->data, arr->elt_sz, arr->len);
+       struct used_mask *msk;
        uint64_t msk_bit = 1ULL << MASK_LEN_TO_MOD(idx);
        unsigned int msk_idx = MASK_LEN_TO_IDX(idx);
        bool already_used;
@@ -365,6 +365,7 @@ set_used(struct rte_fbarray *arr, unsigned int idx, bool used)
                rte_errno = EINVAL;
                return -1;
        }
+       msk = get_used_mask(arr->data, arr->elt_sz, arr->len);
        ret = 0;
 
        /* prevent array from changing under us */
@@ -471,7 +472,7 @@ rte_fbarray_init(struct rte_fbarray *arr, const char *name, unsigned int len,
        memset(data, 0, mmap_len);
 
        /* populate data structure */
-       snprintf(arr->name, sizeof(arr->name), "%s", name);
+       strlcpy(arr->name, name, sizeof(arr->name));
        arr->data = data;
        arr->len = len;
        arr->elt_sz = elt_sz;
@@ -571,6 +572,9 @@ rte_fbarray_detach(struct rte_fbarray *arr)
 
        size_t page_sz = sysconf(_SC_PAGESIZE);
 
+       if (page_sz == (size_t)-1)
+               return -1;
+
        /* this may already be unmapped (e.g. repeated call from previously
         * failed destroy(), but this is on user, we can't (easily) know if this
         * is still mapped.
@@ -594,6 +598,11 @@ rte_fbarray_destroy(struct rte_fbarray *arr)
        eal_get_fbarray_path(path, sizeof(path), arr->name);
 
        fd = open(path, O_RDONLY);
+       if (fd < 0) {
+               RTE_LOG(ERR, EAL, "Could not open fbarray file: %s\n",
+                       strerror(errno));
+               return -1;
+       }
        if (flock(fd, LOCK_EX | LOCK_NB)) {
                RTE_LOG(DEBUG, EAL, "Cannot destroy fbarray - another process is using it\n");
                rte_errno = EBUSY;