]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix handling of strtol() and strtoul()
authorMartin Matuska <martin@matuska.org>
Thu, 4 Apr 2019 22:21:32 +0000 (00:21 +0200)
committerMartin Matuska <martin@matuska.org>
Thu, 4 Apr 2019 22:35:58 +0000 (00:35 +0200)
Fixes #1168

libarchive/archive_read_support_format_warc.c
libarchive/archive_write_add_filter_xz.c
libarchive/archive_write_set_format_xar.c

index e8fc8428b41ed79bf969d776add480ad89081b1b..c1c54450c39648fe01abe71db4a041b06140a0f1 100644 (file)
@@ -744,8 +744,9 @@ _warc_rdlen(const char *buf, size_t bsz)
        /* there must be at least one digit */
        if (!isdigit((unsigned char)*val))
                return -1;
+       errno = 0;
        len = strtol(val, &on, 10);
-       if (on != eol) {
+       if (errno != 0 || on != eol) {
                /* line must end here */
                return -1;
        }
index b0f25a6ef0ed837243023f2f2518d49ff8ded6ae..0f7c8cfc31a5daf9d16f21d08f108086b5e610e6 100644 (file)
@@ -390,10 +390,13 @@ archive_compressor_xz_options(struct archive_write_filter *f,
                        data->compression_level = 6;
                return (ARCHIVE_OK);
        } else if (strcmp(key, "threads") == 0) {
+               char *endptr;
+
                if (value == NULL)
                        return (ARCHIVE_WARN);
-               data->threads = (int)strtoul(value, NULL, 10);
-               if (data->threads == 0 && errno != 0) {
+               errno = 0;
+               data->threads = (int)strtoul(value, &endptr, 10);
+               if (errno != 0 || *endptr != '\0') {
                        data->threads = 1;
                        return (ARCHIVE_WARN);
                }
index 36d4a615e2aeda8a8c87705d4665c3c4ea4e69cc..5e4b90e06b3f3e091c75280592454c7f2268c7d0 100644 (file)
@@ -496,10 +496,13 @@ xar_options(struct archive_write *a, const char *key, const char *value)
                return (ARCHIVE_OK);
        }
        if (strcmp(key, "threads") == 0) {
+               char *endptr;
+
                if (value == NULL)
                        return (ARCHIVE_FAILED);
-               xar->opt_threads = (int)strtoul(value, NULL, 10);
-               if (xar->opt_threads == 0 && errno != 0) {
+               errno = 0;
+               xar->opt_threads = (int)strtoul(value, &endptr, 10);
+               if (errno != 0 || *endptr != '\0') {
                        xar->opt_threads = 1;
                        archive_set_error(&(a->archive),
                            ARCHIVE_ERRNO_MISC,