From 3e20e376b7aa26fa43f81f23323c717c4cae1bfb Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 3 Oct 2022 15:06:12 -0400 Subject: [PATCH] Clean up some warnings on Windows builds * src/arscan.c (parse_int): Avoid conversion from int to char and check for overflow given a max value. (ar_scan): Check intmax sizes then cast to the proper type. (ar_member_touch): Get proper return type from ar_scan and cast it to off_t. * src/function.c (a_word_hash_cmp): Don't cast from size_t to int. (func_filter_filterout): Count using unsigned long to avoid casts. (construct_include_path): Explicitly cast to void*. * src/shuffle.c (reverse_shuffle_array): Use size_t index. * src/w32/subproc/sub_proc.c (process_wait_for_multiple_objects): Initialize the return value in case the count is 0. --- src/arscan.c | 47 ++++++++++++++++++++++++++------------ src/function.c | 15 ++++++------ src/read.c | 2 +- src/shuffle.c | 2 +- src/w32/subproc/sub_proc.c | 2 +- 5 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/arscan.c b/src/arscan.c index b7180ba2..69b8695c 100644 --- a/src/arscan.c +++ b/src/arscan.c @@ -376,15 +376,17 @@ struct ar_hdr # define AR_HDR_SIZE (sizeof (struct ar_hdr)) #endif +#include "intprops.h" + #include "output.h" static uintmax_t -parse_int (const char *ptr, const size_t len, const int base, +parse_int (const char *ptr, const size_t len, const int base, uintmax_t max, const char *type, const char *archive, const char *name) { const char *const ep = ptr + len; - const char max = '0' + base - 1; + const int maxchar = '0' + base - 1; uintmax_t val = 0; /* In all the versions I know of the spaces come last, but be safe. */ @@ -393,10 +395,16 @@ parse_int (const char *ptr, const size_t len, const int base, while (ptr < ep && *ptr != ' ') { - if (*ptr < '0' || *ptr > max) - OSSS (fatal, NILF, _("Invalid %s for archive %s member %s"), - type, archive, name); - val = (val * base) + (*ptr - '0'); + uintmax_t nv; + + if (*ptr < '0' || *ptr > maxchar) + OSSS (fatal, NILF, + _("Invalid %s for archive %s member %s"), type, archive, name); + nv = (val * base) + (*ptr - '0'); + if (nv < val || nv > max) + OSSS (fatal, NILF, + _("Invalid %s for archive %s member %s"), type, archive, name); + val = nv; ++ptr; } @@ -562,6 +570,8 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg) #endif long int eltsize; unsigned int eltmode; + intmax_t eltdate; + int eltuid, eltgid; intmax_t fnval; off_t o; @@ -732,8 +742,16 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg) } #ifndef M_XENIX - eltmode = parse_int (TOCHAR (member_header.ar_mode), sizeof (member_header.ar_mode), 8, "mode", archive, name); - eltsize = parse_int (TOCHAR (member_header.ar_size), sizeof (member_header.ar_size), 10, "size", archive, name); +#define PARSE_INT(_m, _t, _b, _n) \ + (_t) parse_int (TOCHAR (member_header._m), sizeof (member_header._m), \ + _b, TYPE_MAXIMUM (_t), _n, archive, name) + + eltmode = PARSE_INT (ar_mode, unsigned int, 8, "mode"); + eltsize = PARSE_INT (ar_size, long, 10, "size"); + eltdate = PARSE_INT (ar_date, intmax_t, 10, "date"); + eltuid = PARSE_INT (ar_uid, int, 10, "uid"); + eltgid = PARSE_INT (ar_gid, int, 10, "gid"); +#undef PARSE_INT #else /* Xenix. */ eltmode = (unsigned short int) member_header.ar_mode; eltsize = member_header.ar_size; @@ -743,9 +761,7 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg) (*function) (desc, name, ! long_name, member_offset, member_offset + AR_HDR_SIZE, eltsize, #ifndef M_XENIX - parse_int (TOCHAR (member_header.ar_date), sizeof (member_header.ar_date), 10, "date", archive, name), - parse_int (TOCHAR (member_header.ar_uid), sizeof (member_header.ar_uid), 10, "uid", archive, name), - parse_int (TOCHAR (member_header.ar_gid), sizeof (member_header.ar_gid), 10, "gid", archive, name), + eltdate, eltuid, eltgid, #else /* Xenix. */ member_header.ar_date, member_header.ar_uid, @@ -906,7 +922,8 @@ ar_member_pos (int desc UNUSED, const char *mem, int truncated, int ar_member_touch (const char *arname, const char *memname) { - long int pos = ar_scan (arname, ar_member_pos, memname); + intmax_t pos = ar_scan (arname, ar_member_pos, memname); + off_t opos; int fd; struct ar_hdr ar_hdr; off_t o; @@ -919,11 +936,13 @@ ar_member_touch (const char *arname, const char *memname) if (!pos) return 1; + opos = (off_t) pos; + EINTRLOOP (fd, open (arname, O_RDWR, 0666)); if (fd < 0) return -3; /* Read in this member's header */ - EINTRLOOP (o, lseek (fd, pos, 0)); + EINTRLOOP (o, lseek (fd, opos, 0)); if (o < 0) goto lose; r = readbuf (fd, &ar_hdr, AR_HDR_SIZE); @@ -944,7 +963,7 @@ ar_member_touch (const char *arname, const char *memname) ar_hdr.ar_date = statbuf.st_mtime; #endif /* Write back this member's header */ - EINTRLOOP (o, lseek (fd, pos, 0)); + EINTRLOOP (o, lseek (fd, opos, 0)); if (o < 0) goto lose; r = writebuf (fd, &ar_hdr, AR_HDR_SIZE); diff --git a/src/function.c b/src/function.c index 577e2396..fb4ffbc8 100644 --- a/src/function.c +++ b/src/function.c @@ -985,12 +985,13 @@ a_word_hash_2 (const void *key) static int a_word_hash_cmp (const void *x, const void *y) { - int result = (int) ((struct a_word const *) x)->length - ((struct a_word const *) y)->length; - if (result) - return result; - return_STRING_N_COMPARE (((struct a_word const *) x)->str, - ((struct a_word const *) y)->str, - ((struct a_word const *) y)->length); + const struct a_word *ax = x; + const struct a_word *ay = y; + + if (ax->length != ay->length) + return ax->length > ay->length ? 1 : -1; + + return_STRING_N_COMPARE (ax->str, ay->str, ax->length); } struct a_pattern @@ -1009,7 +1010,7 @@ func_filter_filterout (char *o, char **argv, const char *funcname) struct a_pattern *patterns; struct a_pattern *pat_end; struct a_pattern *pp; - size_t pat_count = 0, word_count = 0; + unsigned long pat_count = 0, word_count = 0; struct hash_table a_word_table; int is_filter = funcname[CSTRLEN ("filter")] == '\0'; diff --git a/src/read.c b/src/read.c index 79315503..b13d1dc8 100644 --- a/src/read.c +++ b/src/read.c @@ -3071,7 +3071,7 @@ construct_include_path (const char **arg_dirs) do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp, o_default, f_append, 0); - free (include_directories); + free ((void *) include_directories); include_directories = dirs; } diff --git a/src/shuffle.c b/src/shuffle.c index 5f68caf6..4cfdc943 100644 --- a/src/shuffle.c +++ b/src/shuffle.c @@ -128,7 +128,7 @@ reverse_shuffle_array (void **a, size_t len) void *t; /* Pick mirror and swap. */ - unsigned int j = len - 1 - i; + size_t j = len - 1 - i; /* Swap. */ t = a[i]; diff --git a/src/w32/subproc/sub_proc.c b/src/w32/subproc/sub_proc.c index 2b50d4b5..8331f91d 100644 --- a/src/w32/subproc/sub_proc.c +++ b/src/w32/subproc/sub_proc.c @@ -92,7 +92,7 @@ DWORD process_wait_for_multiple_objects( for (;;) { DWORD objectCount = nCount; int blockCount = 0; - DWORD retVal; + DWORD retVal = 0; assert(bWaitAll == FALSE); /* This logic only works for this use case */ assert(dwMilliseconds == 0 || dwMilliseconds == INFINITE); /* No support for timeouts */