OLD | NEW |
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 SourceStream* diff_skips = patch_streams.stream(3); | 70 SourceStream* diff_skips = patch_streams.stream(3); |
71 SourceStream* diff_bytes = patch_streams.stream(4); | 71 SourceStream* diff_bytes = patch_streams.stream(4); |
72 SourceStream* extra_bytes = patch_streams.stream(5); | 72 SourceStream* extra_bytes = patch_streams.stream(5); |
73 | 73 |
74 const uint8* extra_start = extra_bytes->Buffer(); | 74 const uint8* extra_start = extra_bytes->Buffer(); |
75 const uint8* extra_end = extra_start + extra_bytes->Remaining(); | 75 const uint8* extra_end = extra_start + extra_bytes->Remaining(); |
76 const uint8* extra_position = extra_start; | 76 const uint8* extra_position = extra_start; |
77 | 77 |
78 const uint8* old_position = old_start; | 78 const uint8* old_position = old_start; |
79 | 79 |
80 new_stream->Reserve(header->dlen); | 80 if (header->dlen && !new_stream->Reserve(header->dlen)) |
| 81 return MEM_ERROR; |
81 | 82 |
82 uint32 pending_diff_zeros = 0; | 83 uint32 pending_diff_zeros = 0; |
83 if (!diff_skips->ReadVarint32(&pending_diff_zeros)) | 84 if (!diff_skips->ReadVarint32(&pending_diff_zeros)) |
84 return UNEXPECTED_ERROR; | 85 return UNEXPECTED_ERROR; |
85 | 86 |
86 while (!control_stream_copy_counts->Empty()) { | 87 while (!control_stream_copy_counts->Empty()) { |
87 uint32 copy_count, extra_count; | 88 uint32 copy_count, extra_count; |
88 int32 seek_adjustment; | 89 int32 seek_adjustment; |
89 if (!control_stream_copy_counts->ReadVarint32(©_count)) | 90 if (!control_stream_copy_counts->ReadVarint32(©_count)) |
90 return UNEXPECTED_ERROR; | 91 return UNEXPECTED_ERROR; |
(...skipping 16 matching lines...) Expand all Loading... |
107 uint8 diff_byte = 0; | 108 uint8 diff_byte = 0; |
108 if (pending_diff_zeros) { | 109 if (pending_diff_zeros) { |
109 --pending_diff_zeros; | 110 --pending_diff_zeros; |
110 } else { | 111 } else { |
111 if (!diff_skips->ReadVarint32(&pending_diff_zeros)) | 112 if (!diff_skips->ReadVarint32(&pending_diff_zeros)) |
112 return UNEXPECTED_ERROR; | 113 return UNEXPECTED_ERROR; |
113 if (!diff_bytes->Read(&diff_byte, 1)) | 114 if (!diff_bytes->Read(&diff_byte, 1)) |
114 return UNEXPECTED_ERROR; | 115 return UNEXPECTED_ERROR; |
115 } | 116 } |
116 uint8 byte = old_position[i] + diff_byte; | 117 uint8 byte = old_position[i] + diff_byte; |
117 new_stream->Write(&byte, 1); | 118 if (!new_stream->Write(&byte, 1)) |
| 119 return MEM_ERROR; |
118 } | 120 } |
119 old_position += copy_count; | 121 old_position += copy_count; |
120 | 122 |
121 // Copy bytes from the extra block. | 123 // Copy bytes from the extra block. |
122 if (extra_count > static_cast<size_t>(extra_end - extra_position)) | 124 if (extra_count > static_cast<size_t>(extra_end - extra_position)) |
123 return UNEXPECTED_ERROR; | 125 return UNEXPECTED_ERROR; |
124 | 126 |
125 new_stream->Write(extra_position, extra_count); | 127 if (!new_stream->Write(extra_position, extra_count)) |
| 128 return MEM_ERROR; |
| 129 |
126 extra_position += extra_count; | 130 extra_position += extra_count; |
127 | 131 |
128 // "seek" forwards (or backwards) in oldfile. | 132 // "seek" forwards (or backwards) in oldfile. |
129 if (old_position + seek_adjustment < old_start || | 133 if (old_position + seek_adjustment < old_start || |
130 old_position + seek_adjustment > old_end) | 134 old_position + seek_adjustment > old_end) |
131 return UNEXPECTED_ERROR; | 135 return UNEXPECTED_ERROR; |
132 | 136 |
133 old_position += seek_adjustment; | 137 old_position += seek_adjustment; |
134 } | 138 } |
135 | 139 |
(...skipping 22 matching lines...) Expand all Loading... |
158 | 162 |
159 if (CalculateCrc(old_start, old_size) != header.scrc32) | 163 if (CalculateCrc(old_start, old_size) != header.scrc32) |
160 return CRC_ERROR; | 164 return CRC_ERROR; |
161 | 165 |
162 MBS_ApplyPatch(&header, patch_stream, old_start, old_size, new_stream); | 166 MBS_ApplyPatch(&header, patch_stream, old_start, old_size, new_stream); |
163 | 167 |
164 return OK; | 168 return OK; |
165 } | 169 } |
166 | 170 |
167 } // namespace | 171 } // namespace |
OLD | NEW |