diff options
author | Damien Miller <djm@mindrot.org> | 2019-11-15 16:06:30 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2019-11-15 16:06:30 +1100 |
commit | fbcb9a7fa55300b8bd4c18bee024c6104c5a25d7 (patch) | |
tree | 70ba057302311ed31678bf0167e13dbc5d72771d | |
parent | 2cfb11abac85885de0cb888bbeb9a3e4303105ea (diff) |
upstream commit
revision 1.48
date: 2019/02/04 16:45:40; author: millert; state: Exp; lines: +16 -17; commitid: cpNtVC7erojNyctw;
Make gl_pathc, gl_matchc and gl_offs size_t in glob_t to match POSIX.
This requires a libc major version bump. OK deraadt@
-rw-r--r-- | openbsd-compat/glob.c | 33 | ||||
-rw-r--r-- | openbsd-compat/glob.h | 9 |
2 files changed, 21 insertions, 21 deletions
diff --git a/openbsd-compat/glob.c b/openbsd-compat/glob.c index 27710b4d6..1e346a8f6 100644 --- a/openbsd-compat/glob.c +++ b/openbsd-compat/glob.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: glob.c,v 1.47 2017/05/08 14:53:27 millert Exp $ */ | 1 | /* $OpenBSD: glob.c,v 1.48 2019/02/04 16:45:40 millert Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 1989, 1993 | 3 | * Copyright (c) 1989, 1993 |
4 | * The Regents of the University of California. All rights reserved. | 4 | * The Regents of the University of California. All rights reserved. |
@@ -150,7 +150,7 @@ struct glob_path_stat { | |||
150 | 150 | ||
151 | static int compare(const void *, const void *); | 151 | static int compare(const void *, const void *); |
152 | static int compare_gps(const void *, const void *); | 152 | static int compare_gps(const void *, const void *); |
153 | static int g_Ctoc(const Char *, char *, u_int); | 153 | static int g_Ctoc(const Char *, char *, size_t); |
154 | static int g_lstat(Char *, struct stat *, glob_t *); | 154 | static int g_lstat(Char *, struct stat *, glob_t *); |
155 | static DIR *g_opendir(Char *, glob_t *); | 155 | static DIR *g_opendir(Char *, glob_t *); |
156 | static Char *g_strchr(const Char *, int); | 156 | static Char *g_strchr(const Char *, int); |
@@ -198,9 +198,8 @@ glob(const char *pattern, int flags, int (*errfunc)(const char *, int), | |||
198 | if (strnlen(pattern, PATH_MAX) == PATH_MAX) | 198 | if (strnlen(pattern, PATH_MAX) == PATH_MAX) |
199 | return(GLOB_NOMATCH); | 199 | return(GLOB_NOMATCH); |
200 | 200 | ||
201 | if (pglob->gl_offs < 0 || pglob->gl_pathc < 0 || | 201 | if (pglob->gl_offs >= SSIZE_MAX || pglob->gl_pathc >= SSIZE_MAX || |
202 | pglob->gl_offs >= INT_MAX || pglob->gl_pathc >= INT_MAX || | 202 | pglob->gl_pathc >= SSIZE_MAX - pglob->gl_offs - 1) |
203 | pglob->gl_pathc >= INT_MAX - pglob->gl_offs - 1) | ||
204 | return GLOB_NOSPACE; | 203 | return GLOB_NOSPACE; |
205 | 204 | ||
206 | bufnext = patbuf; | 205 | bufnext = patbuf; |
@@ -472,7 +471,8 @@ static int | |||
472 | glob0(const Char *pattern, glob_t *pglob, struct glob_lim *limitp) | 471 | glob0(const Char *pattern, glob_t *pglob, struct glob_lim *limitp) |
473 | { | 472 | { |
474 | const Char *qpatnext; | 473 | const Char *qpatnext; |
475 | int c, err, oldpathc; | 474 | int c, err; |
475 | size_t oldpathc; | ||
476 | Char *bufnext, patbuf[PATH_MAX]; | 476 | Char *bufnext, patbuf[PATH_MAX]; |
477 | 477 | ||
478 | qpatnext = globtilde(pattern, patbuf, PATH_MAX, pglob); | 478 | qpatnext = globtilde(pattern, patbuf, PATH_MAX, pglob); |
@@ -566,9 +566,9 @@ glob0(const Char *pattern, glob_t *pglob, struct glob_lim *limitp) | |||
566 | if ((pglob->gl_flags & GLOB_KEEPSTAT)) { | 566 | if ((pglob->gl_flags & GLOB_KEEPSTAT)) { |
567 | /* Keep the paths and stat info synced during sort */ | 567 | /* Keep the paths and stat info synced during sort */ |
568 | struct glob_path_stat *path_stat; | 568 | struct glob_path_stat *path_stat; |
569 | int i; | 569 | size_t i; |
570 | int n = pglob->gl_pathc - oldpathc; | 570 | size_t n = pglob->gl_pathc - oldpathc; |
571 | int o = pglob->gl_offs + oldpathc; | 571 | size_t o = pglob->gl_offs + oldpathc; |
572 | 572 | ||
573 | if ((path_stat = calloc(n, sizeof(*path_stat))) == NULL) | 573 | if ((path_stat = calloc(n, sizeof(*path_stat))) == NULL) |
574 | return GLOB_NOSPACE; | 574 | return GLOB_NOSPACE; |
@@ -797,20 +797,19 @@ globextend(const Char *path, glob_t *pglob, struct glob_lim *limitp, | |||
797 | struct stat *sb) | 797 | struct stat *sb) |
798 | { | 798 | { |
799 | char **pathv; | 799 | char **pathv; |
800 | ssize_t i; | 800 | size_t i, newn, len; |
801 | size_t newn, len; | ||
802 | char *copy = NULL; | 801 | char *copy = NULL; |
803 | const Char *p; | 802 | const Char *p; |
804 | struct stat **statv; | 803 | struct stat **statv; |
805 | 804 | ||
806 | newn = 2 + pglob->gl_pathc + pglob->gl_offs; | 805 | newn = 2 + pglob->gl_pathc + pglob->gl_offs; |
807 | if (pglob->gl_offs >= INT_MAX || | 806 | if (pglob->gl_offs >= SSIZE_MAX || |
808 | pglob->gl_pathc >= INT_MAX || | 807 | pglob->gl_pathc >= SSIZE_MAX || |
809 | newn >= INT_MAX || | 808 | newn >= SSIZE_MAX || |
810 | SIZE_MAX / sizeof(*pathv) <= newn || | 809 | SIZE_MAX / sizeof(*pathv) <= newn || |
811 | SIZE_MAX / sizeof(*statv) <= newn) { | 810 | SIZE_MAX / sizeof(*statv) <= newn) { |
812 | nospace: | 811 | nospace: |
813 | for (i = pglob->gl_offs; i < (ssize_t)(newn - 2); i++) { | 812 | for (i = pglob->gl_offs; i < newn - 2; i++) { |
814 | if (pglob->gl_pathv && pglob->gl_pathv[i]) | 813 | if (pglob->gl_pathv && pglob->gl_pathv[i]) |
815 | free(pglob->gl_pathv[i]); | 814 | free(pglob->gl_pathv[i]); |
816 | if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0 && | 815 | if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0 && |
@@ -971,7 +970,7 @@ fail: | |||
971 | void | 970 | void |
972 | globfree(glob_t *pglob) | 971 | globfree(glob_t *pglob) |
973 | { | 972 | { |
974 | int i; | 973 | size_t i; |
975 | char **pp; | 974 | char **pp; |
976 | 975 | ||
977 | if (pglob->gl_pathv != NULL) { | 976 | if (pglob->gl_pathv != NULL) { |
@@ -1043,7 +1042,7 @@ g_strchr(const Char *str, int ch) | |||
1043 | } | 1042 | } |
1044 | 1043 | ||
1045 | static int | 1044 | static int |
1046 | g_Ctoc(const Char *str, char *buf, u_int len) | 1045 | g_Ctoc(const Char *str, char *buf, size_t len) |
1047 | { | 1046 | { |
1048 | 1047 | ||
1049 | while (len--) { | 1048 | while (len--) { |
diff --git a/openbsd-compat/glob.h b/openbsd-compat/glob.h index f069a05dc..1692d36cc 100644 --- a/openbsd-compat/glob.h +++ b/openbsd-compat/glob.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: glob.h,v 1.11 2010/09/24 13:32:55 djm Exp $ */ | 1 | /* $OpenBSD: glob.h,v 1.14 2019/02/04 16:45:40 millert Exp $ */ |
2 | /* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */ | 2 | /* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */ |
3 | 3 | ||
4 | /* | 4 | /* |
@@ -46,6 +46,7 @@ | |||
46 | #define _COMPAT_GLOB_H_ | 46 | #define _COMPAT_GLOB_H_ |
47 | 47 | ||
48 | #include <sys/stat.h> | 48 | #include <sys/stat.h> |
49 | #include <sys/types.h> | ||
49 | 50 | ||
50 | # define glob_t _ssh_compat_glob_t | 51 | # define glob_t _ssh_compat_glob_t |
51 | # define glob(a, b, c, d) _ssh__compat_glob(a, b, c, d) | 52 | # define glob(a, b, c, d) _ssh__compat_glob(a, b, c, d) |
@@ -53,9 +54,9 @@ | |||
53 | 54 | ||
54 | struct stat; | 55 | struct stat; |
55 | typedef struct { | 56 | typedef struct { |
56 | int gl_pathc; /* Count of total paths so far. */ | 57 | size_t gl_pathc; /* Count of total paths so far. */ |
57 | int gl_matchc; /* Count of paths matching pattern. */ | 58 | size_t gl_matchc; /* Count of paths matching pattern. */ |
58 | int gl_offs; /* Reserved at beginning of gl_pathv. */ | 59 | size_t gl_offs; /* Reserved at beginning of gl_pathv. */ |
59 | int gl_flags; /* Copy of flags parameter to glob. */ | 60 | int gl_flags; /* Copy of flags parameter to glob. */ |
60 | char **gl_pathv; /* List of paths matching pattern. */ | 61 | char **gl_pathv; /* List of paths matching pattern. */ |
61 | struct stat **gl_statv; /* Stat entries corresponding to gl_pathv */ | 62 | struct stat **gl_statv; /* Stat entries corresponding to gl_pathv */ |