Mercurial > hg > nginx
view src/core/ngx_crc32.h @ 7145:83600ce25995 stable-1.12
Fixed buffer overread with unix sockets after accept().
Some OSes (notably macOS, NetBSD, and Solaris) allow unix socket addresses
larger than struct sockaddr_un. Moreover, some of them (macOS, Solaris)
return socklen of the socket address before it was truncated to fit the
buffer provided. As such, on these systems socklen must not be used without
additional check that it is within the buffer provided.
Appropriate checks added to ngx_event_accept() (after accept()),
ngx_event_recvmsg() (after recvmsg()), and ngx_set_inherited_sockets()
(after getsockname()).
We also obtain socket addresses via getsockname() in
ngx_connection_local_sockaddr(), but it does not need any checks as
it is only used for INET and INET6 sockets (as there can be no
wildcard unix sockets).
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 04 Oct 2017 21:19:33 +0300 |
parents | d620f497c50f |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_CRC32_H_INCLUDED_ #define _NGX_CRC32_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> extern uint32_t *ngx_crc32_table_short; extern uint32_t ngx_crc32_table256[]; static ngx_inline uint32_t ngx_crc32_short(u_char *p, size_t len) { u_char c; uint32_t crc; crc = 0xffffffff; while (len--) { c = *p++; crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4); crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4); } return crc ^ 0xffffffff; } static ngx_inline uint32_t ngx_crc32_long(u_char *p, size_t len) { uint32_t crc; crc = 0xffffffff; while (len--) { crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8); } return crc ^ 0xffffffff; } #define ngx_crc32_init(crc) \ crc = 0xffffffff static ngx_inline void ngx_crc32_update(uint32_t *crc, u_char *p, size_t len) { uint32_t c; c = *crc; while (len--) { c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8); } *crc = c; } #define ngx_crc32_final(crc) \ crc ^= 0xffffffff ngx_int_t ngx_crc32_table_init(void); #endif /* _NGX_CRC32_H_INCLUDED_ */