Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: third_party/bspatch/mbspatch.cc

Issue 21049006: Improve error handling in bspatch. (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/bspatch/README.chromium ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /*- 1 /*-
2 * Copyright 2003,2004 Colin Percival 2 * Copyright 2003,2004 Colin Percival
3 * All rights reserved 3 * All rights reserved
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted providing that the following conditions 6 * modification, are permitted providing that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 * OR. Note that this would be DANGEROUS AND UNSOUND if we used 204 * OR. Note that this would be DANGEROUS AND UNSOUND if we used
205 * _O_BINARY other than as a bitwise OR mask (e.g., as a bitwise AND 205 * _O_BINARY other than as a bitwise OR mask (e.g., as a bitwise AND
206 * mask to check for binary mode), but it seems OK in the limited 206 * mask to check for binary mode), but it seems OK in the limited
207 * context of the following small function. */ 207 * context of the following small function. */
208 #ifndef _O_BINARY 208 #ifndef _O_BINARY
209 # define _O_BINARY 0 209 # define _O_BINARY 0
210 #endif 210 #endif
211 211
212 int ApplyBinaryPatch(const wchar_t *old_file, const wchar_t *patch_file, 212 int ApplyBinaryPatch(const wchar_t *old_file, const wchar_t *patch_file,
213 const wchar_t *new_file) { 213 const wchar_t *new_file) {
214 int ret = 0; 214 int ret = OK;
215 int ofd = -1;
216 int nfd = -1;
217 unsigned char *buf = NULL;
218
215 int pfd = _wopen(patch_file, O_RDONLY | _O_BINARY); 219 int pfd = _wopen(patch_file, O_RDONLY | _O_BINARY);
216 if (pfd < 0) return READ_ERROR; 220 if (pfd < 0) return READ_ERROR;
217 221
218 MBSPatchHeader header; 222 do {
219 if (ret = MBS_ReadHeader(pfd, &header)) return ret; 223 MBSPatchHeader header;
224 if ((ret = MBS_ReadHeader(pfd, &header)))
225 break;
220 226
221 int ofd = _wopen(old_file, O_RDONLY | _O_BINARY); 227 ofd = _wopen(old_file, O_RDONLY | _O_BINARY);
222 if (ofd < 0) return READ_ERROR; 228 if (ofd < 0) {
229 ret = READ_ERROR;
230 break;
231 }
223 232
224 struct stat os; 233 struct stat os;
225 if (ret = fstat(ofd, &os)) return READ_ERROR; 234 if ((ret = fstat(ofd, &os))) {
226 if (os.st_size != header.slen) return UNEXPECTED_ERROR; 235 ret = READ_ERROR;
236 break;
237 }
227 238
228 unsigned char *buf = (unsigned char*) malloc(header.slen); 239 if (os.st_size != header.slen) {
229 if (!buf) return MEM_ERROR; 240 ret = UNEXPECTED_ERROR;
241 break;
242 }
230 243
231 if (read(ofd, buf, header.slen) != header.slen) return READ_ERROR; 244 buf = (unsigned char*) malloc(header.slen);
232 if (CalculateCrc(buf, header.slen) != header.scrc32) 245 if (!buf) {
233 return CRC_ERROR; 246 ret = MEM_ERROR;
247 break;
248 }
234 249
235 int nfd = _wopen(new_file, O_WRONLY | O_TRUNC | O_CREAT | _O_BINARY); 250 if (read(ofd, buf, header.slen) != header.slen) {
236 if (nfd < 0) return READ_ERROR; 251 ret = READ_ERROR;
252 break;
253 }
237 254
238 MBS_ApplyPatch(&header, pfd, buf, nfd); 255 if (CalculateCrc(buf, header.slen) != header.scrc32) {
256 ret = CRC_ERROR;
257 break;
258 }
259
260 nfd = _wopen(new_file, O_WRONLY | O_TRUNC | O_CREAT | _O_BINARY);
261 if (nfd < 0) {
262 ret = READ_ERROR;
263 break;
264 }
265
266 MBS_ApplyPatch(&header, pfd, buf, nfd);
267 } while (0);
Avi (use Gerrit) 2013/07/29 14:46:21 Huh. I don't think I've seen this style anywhere i
239 268
240 free(buf); 269 free(buf);
241 close(pfd); 270 close(pfd);
242 close(ofd); 271 if (ofd >= 0) close(ofd);
243 close(nfd); 272 if (nfd >= 0) close(nfd);
244 return OK; 273 return ret;
245 } 274 }
OLDNEW
« no previous file with comments | « third_party/bspatch/README.chromium ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698