]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: fix string_add_to_idarray() int vs. size_t
authorKarel Zak <kzak@redhat.com>
Wed, 22 Apr 2015 09:08:05 +0000 (11:08 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 22 Apr 2015 09:08:05 +0000 (11:08 +0200)
The function uses "int" as argument, but for array size (and index) is better
to use unsigned type (size_t). If we mix "size_t" in util (e.g. fdisk)
and "int" in lib/strutils.c then result is unexpected behavior on
ppc64.

# sfdisk --list -o DEVICE,START,SIZE /dev/sdb
Disk /dev/sdb: 50 MiB, 52428800 bytes, 102400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 32768 bytes
Disklabel type: gpt
Disk identifier: 3B8559DB-33AF-43E9-BEFC-C331D829B539
lt-sfdisk: libfdisk/src/label.c:178: fdisk_label_get_field: Assertion `id > 0' failed.

The patch cleanup all code to use size_t everywhere.

Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/fdisk-list.c
disk-utils/partx.c
include/strutils.h
lib/strutils.c
misc-utils/findmnt.c
misc-utils/lsblk.c
misc-utils/lslocks.c
sys-utils/losetup.c

index 6cd582174293b350d600291805a39608a1a33a01..b2b528e97c79a81e66d9675fa60a6d32fcb15536 100644 (file)
@@ -380,7 +380,7 @@ int *init_fields(struct fdisk_context *cxt, const char *str, size_t *n)
        /* extend or replace fields_nids[] according to fields_string */
        if (fields_string &&
            string_add_to_idarray(fields_string, fields_ids, FDISK_NFIELDS * 2,
-                             (int *) &fields_nids, fieldname_to_id) < 0)
+                                 &fields_nids, fieldname_to_id) < 0)
                exit(EXIT_FAILURE);
 done:
        fields_label = NULL;
index f21c388a7e6aa64394e32a582cde7dc96164cd98..ffc74d6987991043a48f21b55295f164333f2fb3 100644 (file)
@@ -99,7 +99,8 @@ struct colinfo infos[] = {
 #define NCOLS ARRAY_SIZE(infos)
 
 /* array with IDs of enabled columns */
-static int columns[NCOLS], ncolumns;
+static int columns[NCOLS];
+size_t ncolumns;
 
 static int verbose;
 static int partx_flags;
index 847a4219f7ef26ee008420d4ea2d370663177271..8235b501782998a4cbe0391ef2bb152419b4a536 100644 (file)
@@ -92,7 +92,7 @@ extern char *size_to_human_string(int options, uint64_t bytes);
 extern int string_to_idarray(const char *list, int ary[], size_t arysz,
                           int (name2id)(const char *, size_t));
 extern int string_add_to_idarray(const char *list, int ary[],
-                                size_t arysz, int *ary_pos,
+                                size_t arysz, size_t *ary_pos,
                                 int (name2id)(const char *, size_t));
 
 extern int string_to_bitarray(const char *list, char *ary,
index dd776e7abdfbab65a9d881646f00b43a6c151d1b..b8fd2eb5688b4437d38daecfe2f36c8038745eac 100644 (file)
@@ -576,13 +576,12 @@ int string_to_idarray(const char *list, int ary[], size_t arysz,
  * it adds fields to array instead of replacing them.
  */
 int string_add_to_idarray(const char *list, int ary[], size_t arysz,
-                       int *ary_pos, int (name2id)(const char *, size_t))
+                       size_t *ary_pos, int (name2id)(const char *, size_t))
 {
        const char *list_add;
        int r;
 
-       if (!list || !*list || !ary_pos ||
-           *ary_pos < 0 || (size_t) *ary_pos > arysz)
+       if (!list || !*list || !ary_pos || *ary_pos > arysz)
                return -1;
 
        if (list[0] == '+')
index f76ac2e041622b746263fdd2d5b6eb48c30995a1..afeaa2a3fea378f42bccac5393f88843dedf48f7 100644 (file)
@@ -151,7 +151,7 @@ static struct colinfo infos[] = {
  * column twice. That's enough, dynamically allocated array of the columns is
  * unnecessary overkill and over-engineering in this case */
 static int columns[ARRAY_SIZE(infos) * 2];
-static int ncolumns;
+static size_t ncolumns;
 
 static inline size_t err_columns_index(size_t arysz, size_t idx)
 {
@@ -186,7 +186,8 @@ static int match_func(struct libmnt_fs *fs, void *data __attribute__ ((__unused_
 
 static int get_column_id(int num)
 {
-       assert(num < ncolumns);
+       assert(num >= 0);
+       assert((size_t) num < ncolumns);
        assert((size_t) columns[num] < ARRAY_SIZE(infos));
        return columns[num];
 }
@@ -704,7 +705,7 @@ static char *get_tabdiff_data(struct libmnt_fs *old_fs,
 static struct libscols_line *add_line(struct libscols_table *table, struct libmnt_fs *fs,
                                        struct libscols_line *parent)
 {
-       int i;
+       size_t i;
        struct libscols_line *line = scols_table_new_line(table, parent);
 
        if (!line) {
@@ -721,7 +722,7 @@ static struct libscols_line *add_line(struct libscols_table *table, struct libmn
 static struct libscols_line *add_tabdiff_line(struct libscols_table *table, struct libmnt_fs *new_fs,
                        struct libmnt_fs *old_fs, int change)
 {
-       int i;
+       size_t i;
        struct libscols_line *line = scols_table_new_line(table, NULL);
 
        if (!line) {
@@ -1271,9 +1272,10 @@ int main(int argc, char *argv[])
        struct libmnt_table *tb = NULL;
        char **tabfiles = NULL;
        int direction = MNT_ITER_FORWARD;
-       int i, c, rc = -1, timeout = -1;
+       int c, rc = -1, timeout = -1;
        int ntabfiles = 0, tabtype = 0;
        char *outarg = NULL;
+       size_t i;
 
        struct libscols_table *table = NULL;
 
index 6c716ea958b7015f20f5b4005e22afd337e4d4b2..1b4ffc1286ddaf6c0169075fdf69d080ac075c6a 100644 (file)
@@ -222,7 +222,7 @@ struct lsblk *lsblk;        /* global handler */
  * column twice. That's enough, dynamically allocated array of the columns is
  * unnecessary overkill and over-engineering in this case */
 static int columns[ARRAY_SIZE(infos) * 2];
-static int ncolumns;
+static size_t ncolumns;
 
 static inline size_t err_columns_index(size_t arysz, size_t idx)
 {
@@ -329,7 +329,8 @@ static int is_maj_included(int maj)
 /* array with IDs of enabled columns */
 static int get_column_id(int num)
 {
-       assert(num < ncolumns);
+       assert(num >= 0);
+       assert((size_t) num < ncolumns);
        assert(columns[num] < (int) ARRAY_SIZE(infos));
        return columns[num];
 }
@@ -357,7 +358,7 @@ static int column_id_to_number(int id)
 {
        size_t i;
 
-       for (i = 0; i < (size_t) ncolumns; i++)
+       for (i = 0; i < ncolumns; i++)
                if (columns[i] == id)
                        return i;
        return -1;
@@ -1127,7 +1128,7 @@ static void set_scols_data(struct blkdev_cxt *cxt, int col, int id, struct libsc
 
 static void fill_table_line(struct blkdev_cxt *cxt, struct libscols_line *scols_parent)
 {
-       int i;
+       size_t i;
 
        cxt->scols_line = scols_table_new_line(lsblk->table, scols_parent);
        if (!cxt->scols_line)
@@ -1642,8 +1643,9 @@ int main(int argc, char *argv[])
 {
        struct lsblk _ls = { .sort_id = -1 };
        int scols_flags = LSBLK_TREE;
-       int i, c, status = EXIT_FAILURE;
+       int c, status = EXIT_FAILURE;
        char *outarg = NULL;
+       size_t i;
 
        static const struct option longopts[] = {
                { "all",        0, 0, 'a' },
@@ -1730,7 +1732,7 @@ int main(int argc, char *argv[])
                        outarg = optarg;
                        break;
                case 'O':
-                       for (ncolumns = 0 ; ncolumns < (int) ARRAY_SIZE(infos); ncolumns++)
+                       for (ncolumns = 0 ; ncolumns < ARRAY_SIZE(infos); ncolumns++)
                                columns[ncolumns] = ncolumns;
                        break;
                case 'p':
index 9072d6027786248f5af9f20bbe1d80958f02ad85..e2229adc3bbedc7d5cd21b6cae67ed28aa776492 100644 (file)
@@ -82,7 +82,7 @@ static struct colinfo infos[] = {
 };
 
 static int columns[ARRAY_SIZE(infos) * 2];
-static int ncolumns;
+static size_t ncolumns;
 
 static pid_t pid = 0;
 
@@ -343,7 +343,8 @@ static int column_name_to_id(const char *name, size_t namesz)
 
 static inline int get_column_id(int num)
 {
-       assert(num < ncolumns);
+       assert(num >= 0);
+       assert((size_t) num < ncolumns);
        assert(columns[num] < (int) ARRAY_SIZE(infos));
 
        return columns[num];
@@ -385,7 +386,7 @@ static pid_t get_blocker(int id, struct list_head *locks)
 
 static void add_scols_line(struct libscols_table *table, struct lock *l, struct list_head *locks)
 {
-       int i;
+       size_t i;
        struct libscols_line *line;
        /*
         * Whenever cmdname or filename is NULL it is most
@@ -452,7 +453,8 @@ static void add_scols_line(struct libscols_table *table, struct lock *l, struct
 
 static int show_locks(struct list_head *locks)
 {
-       int i, rc = 0;
+       int rc = 0;
+       size_t i;
        struct list_head *p, *pnext;
        struct libscols_table *table;
 
index 29084eab21f0a8ba0418ae56ad54bb1860716a74..c2bbd0d1482d1cc20a3f04c854796711b60d2fef 100644 (file)
@@ -74,11 +74,12 @@ static struct colinfo infos[] = {
 };
 
 static int columns[ARRAY_SIZE(infos) * 2] = {-1};
-static int ncolumns;
+static size_t ncolumns;
 
 static int get_column_id(int num)
 {
-       assert(num < ncolumns);
+       assert(num >= 0);
+       assert((size_t) num < ncolumns);
        assert(columns[num] < (int) ARRAY_SIZE(infos));
        return columns[num];
 }
@@ -213,7 +214,7 @@ static int delete_all_loops(struct loopdev_cxt *lc)
 
 static int set_scols_data(struct loopdev_cxt *lc, struct libscols_line *ln)
 {
-       int i;
+       size_t i;
 
        for (i = 0; i < ncolumns; i++) {
                const char *p = NULL;                   /* external data */
@@ -292,7 +293,8 @@ static int show_table(struct loopdev_cxt *lc,
        struct stat sbuf, *st = &sbuf;
        struct libscols_table *tb;
        struct libscols_line *ln;
-       int i, rc = 0;
+       int rc = 0;
+       size_t i;
 
        scols_init_debug(0);