diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libc/mkstemp/mkstemp_test.c | 113 |
1 files changed, 87 insertions, 26 deletions
diff --git a/src/regress/lib/libc/mkstemp/mkstemp_test.c b/src/regress/lib/libc/mkstemp/mkstemp_test.c index d8311cbf35..fd133d8368 100644 --- a/src/regress/lib/libc/mkstemp/mkstemp_test.c +++ b/src/regress/lib/libc/mkstemp/mkstemp_test.c | |||
| @@ -3,8 +3,9 @@ | |||
| 3 | * | 3 | * |
| 4 | * Public domain. | 4 | * Public domain. |
| 5 | * | 5 | * |
| 6 | * Verify that mkstemp() doesn't overrun or underrun the template buffer | 6 | * Verify that mkstemp() and mkstemps() doesn't overrun or underrun |
| 7 | * and that it can generate names that don't contain any X's | 7 | * the template buffer and that it can generate names that don't |
| 8 | * contain any X's | ||
| 8 | */ | 9 | */ |
| 9 | 10 | ||
| 10 | #include <sys/param.h> | 11 | #include <sys/param.h> |
| @@ -20,12 +21,48 @@ | |||
| 20 | #define MAX_TEMPLATE_LEN 10 | 21 | #define MAX_TEMPLATE_LEN 10 |
| 21 | #define MAX_TRIES 100 | 22 | #define MAX_TRIES 100 |
| 22 | 23 | ||
| 24 | #define SUFFIX ".suff" | ||
| 25 | #define SLEN (sizeof SUFFIX - 1) | ||
| 26 | |||
| 23 | long pg; | 27 | long pg; |
| 24 | 28 | ||
| 25 | void | 29 | /* |
| 26 | try(char *p, const char *prefix, int len) | 30 | * verify that a path generated by mkstemp() or mkstemp() looks like a |
| 31 | * reasonable expansion of the template and matches the fd. Returns true | ||
| 32 | * if all the X's were replaced with non-X's | ||
| 33 | */ | ||
| 34 | int | ||
| 35 | check(int fd, char const *path, char const *prefix, size_t plen, | ||
| 36 | char const *suffix, size_t slen, int tlen) | ||
| 27 | { | 37 | { |
| 28 | struct stat sb, fsb; | 38 | struct stat sb, fsb; |
| 39 | char const *p; | ||
| 40 | |||
| 41 | if (fd < 0) | ||
| 42 | err(1, "mkstemp"); | ||
| 43 | if (stat(path, &sb)) | ||
| 44 | err(1, "stat(%s)", path); | ||
| 45 | if (fstat(fd, &fsb)) | ||
| 46 | err(1, "fstat(%d==%s)", fd, path); | ||
| 47 | if (sb.st_dev != fsb.st_dev || sb.st_ino != fsb.st_ino) | ||
| 48 | errx(1, "stat mismatch"); | ||
| 49 | close(fd); | ||
| 50 | if (memcmp(path, prefix, plen) != 0) | ||
| 51 | errx(1, "prefix changed! %s vs %s", prefix, path); | ||
| 52 | if (memcmp(path + plen + tlen, suffix, slen + 1) != 0) | ||
| 53 | errx(1, "suffix changed! %s vs %s", suffix, path); | ||
| 54 | for (p = path + plen; p < path + plen + tlen; p++) | ||
| 55 | if (*p == '\0') | ||
| 56 | errx(1, "unexpected truncation"); | ||
| 57 | else if (*p == 'X') | ||
| 58 | return 0; | ||
| 59 | return 1; | ||
| 60 | } | ||
| 61 | |||
| 62 | |||
| 63 | void | ||
| 64 | try_mkstemp(char *p, char const *prefix, int len) | ||
| 65 | { | ||
| 29 | char *q; | 66 | char *q; |
| 30 | size_t plen = strlen(prefix); | 67 | size_t plen = strlen(prefix); |
| 31 | int tries, fd; | 68 | int tries, fd; |
| @@ -35,24 +72,27 @@ try(char *p, const char *prefix, int len) | |||
| 35 | memset(p + plen, 'X', len); | 72 | memset(p + plen, 'X', len); |
| 36 | p[plen + len] = '\0'; | 73 | p[plen + len] = '\0'; |
| 37 | fd = mkstemp(p); | 74 | fd = mkstemp(p); |
| 38 | if (fd < 0) | 75 | if (check(fd, p, prefix, plen, "", 0, len)) |
| 39 | err(1, "mkstemp"); | 76 | return; |
| 40 | if (stat(p, &sb)) | 77 | } |
| 41 | err(1, "stat(%s)", p); | 78 | errx(1, "exceeded MAX_TRIES"); |
| 42 | if (fstat(fd, &fsb)) | 79 | } |
| 43 | err(1, "fstat(%d==%s)", fd, p); | 80 | |
| 44 | if (sb.st_dev != fsb.st_dev || sb.st_ino != fsb.st_ino) | 81 | void |
| 45 | errx(1, "stat mismatch"); | 82 | try_mkstemps(char *p, char const *prefix, int len, char const *suffix) |
| 46 | close(fd); | 83 | { |
| 47 | for (q = p + plen; *q != 'X'; q++) { | 84 | char *q; |
| 48 | if (*q == '\0') { | 85 | size_t plen = strlen(prefix); |
| 49 | if (q != p + plen + len) | 86 | size_t slen = strlen(suffix); |
| 50 | errx(1, "unexpected truncation"); | 87 | int tries, fd; |
| 51 | return; | 88 | |
| 52 | } | 89 | for (tries = 0; tries < MAX_TRIES; tries++) { |
| 53 | } | 90 | memcpy(p, prefix, plen); |
| 54 | if (q >= p + plen + len) | 91 | memset(p + plen, 'X', len); |
| 55 | errx(1, "overrun?"); | 92 | memcpy(p + plen + len, suffix, slen + 1); |
| 93 | fd = mkstemps(p, slen); | ||
| 94 | if (check(fd, p, prefix, plen, suffix, slen, len)) | ||
| 95 | return; | ||
| 56 | } | 96 | } |
| 57 | errx(1, "exceeded MAX_TRIES"); | 97 | errx(1, "exceeded MAX_TRIES"); |
| 58 | } | 98 | } |
| @@ -82,13 +122,34 @@ main(void) | |||
| 82 | i = MAX_TEMPLATE_LEN + 1; | 122 | i = MAX_TEMPLATE_LEN + 1; |
| 83 | while (i-- > 1) { | 123 | while (i-- > 1) { |
| 84 | /* try first at the start of a page, no prefix */ | 124 | /* try first at the start of a page, no prefix */ |
| 85 | try(p, "", i); | 125 | try_mkstemp(p, "", i); |
| 86 | /* now at the end of the page, no prefix */ | 126 | /* now at the end of the page, no prefix */ |
| 87 | try(p + pg - i - 1, "", i); | 127 | try_mkstemp(p + pg - i - 1, "", i); |
| 88 | /* start of the page, prefixed with the cwd */ | 128 | /* start of the page, prefixed with the cwd */ |
| 89 | try(p, cwd, i); | 129 | try_mkstemp(p, cwd, i); |
| 90 | /* how about at the end of the page, prefixed with cwd? */ | 130 | /* how about at the end of the page, prefixed with cwd? */ |
| 91 | try(p + pg - i - 1 - clen, cwd, i); | 131 | try_mkstemp(p + pg - clen - i - 1, cwd, i); |
| 132 | |||
| 133 | /* again, with mkstemps() and an empty suffix */ | ||
| 134 | /* try first at the start of a page, no prefix */ | ||
| 135 | try_mkstemps(p, "", i, ""); | ||
| 136 | /* now at the end of the page, no prefix */ | ||
| 137 | try_mkstemps(p + pg - i - 1, "", i, ""); | ||
| 138 | /* start of the page, prefixed with the cwd */ | ||
| 139 | try_mkstemps(p, cwd, i, ""); | ||
| 140 | /* how about at the end of the page, prefixed with cwd? */ | ||
| 141 | try_mkstemps(p + pg - clen - i - 1, cwd, i, ""); | ||
| 142 | |||
| 143 | /* mkstemps() and a non-empty suffix */ | ||
| 144 | /* try first at the start of a page, no prefix */ | ||
| 145 | try_mkstemps(p, "", i, SUFFIX); | ||
| 146 | /* now at the end of the page, no prefix */ | ||
| 147 | try_mkstemps(p + pg - i - SLEN - 1, "", i, SUFFIX); | ||
| 148 | /* start of the page, prefixed with the cwd */ | ||
| 149 | try_mkstemps(p, cwd, i, SUFFIX); | ||
| 150 | /* how about at the end of the page, prefixed with cwd? */ | ||
| 151 | try_mkstemps(p + pg - clen - i - SLEN - 1, cwd, i, SUFFIX); | ||
| 152 | |||
| 92 | } | 153 | } |
| 93 | 154 | ||
| 94 | return 0; | 155 | return 0; |
