diff options
| author | Paul Eggert | 2019-04-18 12:56:23 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-04-18 12:57:47 -0700 |
| commit | df5ca4f7e66fe075d1ad12a0e2831c4ed91fd186 (patch) | |
| tree | f5c543de0be5b629b7ffa64e7d922151374ed152 /lib-src/make-fingerprint.c | |
| parent | a99a3542f3ae6c17af033c17f03a45a1def75e8f (diff) | |
| download | emacs-df5ca4f7e66fe075d1ad12a0e2831c4ed91fd186.tar.gz emacs-df5ca4f7e66fe075d1ad12a0e2831c4ed91fd186.zip | |
Fix make-fingerprint off-by-one bug
Problem reported by Alex Gramiak in:
https://lists.gnu.org/r/emacs-devel/2019-04/msg00784.html
* lib-src/make-fingerprint.c (main): Fix recently-introduced
off-by-one bug when accessing args after -r.
Diffstat (limited to 'lib-src/make-fingerprint.c')
| -rw-r--r-- | lib-src/make-fingerprint.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/lib-src/make-fingerprint.c b/lib-src/make-fingerprint.c index 535e5751320..b0a51abf290 100644 --- a/lib-src/make-fingerprint.c +++ b/lib-src/make-fingerprint.c | |||
| @@ -80,24 +80,26 @@ main (int argc, char **argv) | |||
| 80 | struct sha256_ctx ctx; | 80 | struct sha256_ctx ctx; |
| 81 | sha256_init_ctx (&ctx); | 81 | sha256_init_ctx (&ctx); |
| 82 | 82 | ||
| 83 | char *prog = prog; | ||
| 84 | char *file = argv[optind]; | ||
| 83 | if (argc - optind != 1) | 85 | if (argc - optind != 1) |
| 84 | { | 86 | { |
| 85 | fprintf (stderr, "%s: missing or extra file operand\n", argv[0]); | 87 | fprintf (stderr, "%s: missing or extra file operand\n", prog); |
| 86 | return EXIT_FAILURE; | 88 | return EXIT_FAILURE; |
| 87 | } | 89 | } |
| 88 | 90 | ||
| 89 | FILE *f = fopen (argv[1], raw ? "r" FOPEN_BINARY : "r+" FOPEN_BINARY); | 91 | FILE *f = fopen (file, raw ? "r" FOPEN_BINARY : "r+" FOPEN_BINARY); |
| 90 | struct stat st; | 92 | struct stat st; |
| 91 | if (!f || fstat (fileno (f), &st) != 0) | 93 | if (!f || fstat (fileno (f), &st) != 0) |
| 92 | { | 94 | { |
| 93 | perror (argv[1]); | 95 | perror (file); |
| 94 | return EXIT_FAILURE; | 96 | return EXIT_FAILURE; |
| 95 | } | 97 | } |
| 96 | 98 | ||
| 97 | if (!S_ISREG (st.st_mode)) | 99 | if (!S_ISREG (st.st_mode)) |
| 98 | { | 100 | { |
| 99 | fprintf (stderr, "%s: Error: %s is not a regular file\n", | 101 | fprintf (stderr, "%s: Error: %s is not a regular file\n", |
| 100 | argv[0], argv[1]); | 102 | prog, file); |
| 101 | return EXIT_FAILURE; | 103 | return EXIT_FAILURE; |
| 102 | } | 104 | } |
| 103 | 105 | ||
| @@ -105,7 +107,7 @@ main (int argc, char **argv) | |||
| 105 | min (SIZE_MAX, SSIZE_MAX)); | 107 | min (SIZE_MAX, SSIZE_MAX)); |
| 106 | if (maxlen <= st.st_size) | 108 | if (maxlen <= st.st_size) |
| 107 | { | 109 | { |
| 108 | fprintf (stderr, "%s: %s: file too big\n", argv[0], argv[1]); | 110 | fprintf (stderr, "%s: %s: file too big\n", prog, file); |
| 109 | return EXIT_FAILURE; | 111 | return EXIT_FAILURE; |
| 110 | } | 112 | } |
| 111 | 113 | ||
| @@ -119,8 +121,7 @@ main (int argc, char **argv) | |||
| 119 | size_t chunksz = fread (buf, 1, st.st_size + 1, f); | 121 | size_t chunksz = fread (buf, 1, st.st_size + 1, f); |
| 120 | if (ferror (f) || chunksz != st.st_size) | 122 | if (ferror (f) || chunksz != st.st_size) |
| 121 | { | 123 | { |
| 122 | fprintf (stderr, "%s: Error: could not read %s\n", | 124 | fprintf (stderr, "%s: Error: could not read %s\n", prog, file); |
| 123 | argv[0], argv[1]); | ||
| 124 | return EXIT_FAILURE; | 125 | return EXIT_FAILURE; |
| 125 | } | 126 | } |
| 126 | 127 | ||
| @@ -139,33 +140,33 @@ main (int argc, char **argv) | |||
| 139 | char *finger = memmem (buf, chunksz, fingerprint, sizeof fingerprint); | 140 | char *finger = memmem (buf, chunksz, fingerprint, sizeof fingerprint); |
| 140 | if (!finger) | 141 | if (!finger) |
| 141 | { | 142 | { |
| 142 | fprintf (stderr, "%s: %s: missing fingerprint\n", argv[0], argv[1]); | 143 | fprintf (stderr, "%s: %s: missing fingerprint\n", prog, file); |
| 143 | return EXIT_FAILURE; | 144 | return EXIT_FAILURE; |
| 144 | } | 145 | } |
| 145 | else if (memmem (finger + 1, buf + chunksz - (finger + 1), | 146 | else if (memmem (finger + 1, buf + chunksz - (finger + 1), |
| 146 | fingerprint, sizeof fingerprint)) | 147 | fingerprint, sizeof fingerprint)) |
| 147 | { | 148 | { |
| 148 | fprintf (stderr, "%s: %s: two occurrences of fingerprint\n", | 149 | fprintf (stderr, "%s: %s: two occurrences of fingerprint\n", |
| 149 | argv[0], argv[1]); | 150 | prog, file); |
| 150 | return EXIT_FAILURE; | 151 | return EXIT_FAILURE; |
| 151 | } | 152 | } |
| 152 | 153 | ||
| 153 | if (fseeko (f, finger - buf, SEEK_SET) != 0) | 154 | if (fseeko (f, finger - buf, SEEK_SET) != 0) |
| 154 | { | 155 | { |
| 155 | perror (argv[1]); | 156 | perror (file); |
| 156 | return EXIT_FAILURE; | 157 | return EXIT_FAILURE; |
| 157 | } | 158 | } |
| 158 | 159 | ||
| 159 | if (fwrite (digest, 1, sizeof digest, f) != sizeof digest) | 160 | if (fwrite (digest, 1, sizeof digest, f) != sizeof digest) |
| 160 | { | 161 | { |
| 161 | perror (argv[1]); | 162 | perror (file); |
| 162 | return EXIT_FAILURE; | 163 | return EXIT_FAILURE; |
| 163 | } | 164 | } |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 166 | if (fclose (f) != 0) | 167 | if (fclose (f) != 0) |
| 167 | { | 168 | { |
| 168 | perror (argv[1]); | 169 | perror (file); |
| 169 | return EXIT_FAILURE; | 170 | return EXIT_FAILURE; |
| 170 | } | 171 | } |
| 171 | 172 | ||