Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
lib/strutils: fix string_add_to_idarray() int vs. size_t
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>
  • Loading branch information
karelzak committed Apr 22, 2015
1 parent 622be27 commit 40b1750
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 25 deletions.
2 changes: 1 addition & 1 deletion disk-utils/fdisk-list.c
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion disk-utils/partx.c
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion include/strutils.h
Expand Up @@ -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,
Expand Down
5 changes: 2 additions & 3 deletions lib/strutils.c
Expand Up @@ -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] == '+')
Expand Down
12 changes: 7 additions & 5 deletions misc-utils/findmnt.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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];
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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;

Expand Down
14 changes: 8 additions & 6 deletions misc-utils/lsblk.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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];
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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' },
Expand Down Expand Up @@ -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':
Expand Down
10 changes: 6 additions & 4 deletions misc-utils/lslocks.c
Expand Up @@ -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;

Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down
10 changes: 6 additions & 4 deletions sys-utils/losetup.c
Expand Up @@ -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];
}
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 40b1750

Please sign in to comment.