aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src/make-fingerprint.c
diff options
context:
space:
mode:
authorPaul Eggert2019-04-18 12:56:23 -0700
committerPaul Eggert2019-04-18 12:57:47 -0700
commitdf5ca4f7e66fe075d1ad12a0e2831c4ed91fd186 (patch)
treef5c543de0be5b629b7ffa64e7d922151374ed152 /lib-src/make-fingerprint.c
parenta99a3542f3ae6c17af033c17f03a45a1def75e8f (diff)
downloademacs-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.c25
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