Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_mp4_module.c @ 7400:be5cb9c67c05
Mp4: fixed possible pointer overflow on 32-bit platforms.
On 32-bit platforms mp4->buffer_pos might overflow when a large
enough (close to 4 gigabytes) atom is being skipped, resulting in
incorrect memory addesses being read further in the code. In most
cases this results in harmless errors being logged, though may also
result in a segmentation fault if hitting unmapped pages.
To address this, ngx_mp4_atom_next() now only increments mp4->buffer_pos
up to mp4->buffer_end. This ensures that overflow cannot happen.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 21 Nov 2018 20:23:16 +0300 |
parents | e5069816039b |
children | f47f7d3d1bfa |
comparison
equal
deleted
inserted
replaced
7399:d6ca744c727e | 7400:be5cb9c67c05 |
---|---|
167 #define ngx_mp4_atom_data(mp4) mp4->buffer_pos | 167 #define ngx_mp4_atom_data(mp4) mp4->buffer_pos |
168 #define ngx_mp4_atom_data_size(t) (uint64_t) (sizeof(t) - 8) | 168 #define ngx_mp4_atom_data_size(t) (uint64_t) (sizeof(t) - 8) |
169 | 169 |
170 | 170 |
171 #define ngx_mp4_atom_next(mp4, n) \ | 171 #define ngx_mp4_atom_next(mp4, n) \ |
172 mp4->buffer_pos += (size_t) n; \ | 172 \ |
173 if (n > (size_t) (mp4->buffer_end - mp4->buffer_pos)) { \ | |
174 mp4->buffer_pos = mp4->buffer_end; \ | |
175 \ | |
176 } else { \ | |
177 mp4->buffer_pos += (size_t) n; \ | |
178 } \ | |
179 \ | |
173 mp4->offset += n | 180 mp4->offset += n |
174 | 181 |
175 | 182 |
176 #define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \ | 183 #define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \ |
177 ((u_char *) (p))[4] = n1; \ | 184 ((u_char *) (p))[4] = n1; \ |