[BUG] SocketAddr performs misaligned sockaddr_in access through reinterpret_cast

Cerrado
#4,307 6 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@JonSnow1807 ya está trabajando en esto.

Desde el 22/10/2026.

  • #4629 de @Shubhammehta2008 — cerrado sin fusionar
  • #4725 de @JonSnow1807 — abierto

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp
Área
networking

Línea de trabajo

Comienza en ext/include/opentelemetry/ext/http/server/socket_tools.h, en SocketTools::SocketAddr(u_long addr, int port), y luego sigue su llamador addListeningPort. Compara la sobrecarga de enteros con el enfoque basado en memcpy de #4292. La tarea estará terminada cuando el constructor evite el acceso desalineado a sockaddr_in y tenga un comportamiento definido para los puertos fuera de 0..65535, con UBSan y las comprobaciones de comportamiento relevantes superadas.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

triage/accepted
Description

SocketTools::SocketAddr(u_long addr, int port) in ext/include/opentelemetry/ext/http/server/socket_tools.h has two defects:

1. Alignment / type-access UB. It binds a sockaddr_in & to the sockaddr m_data storage through a reinterpret_cast:

sockaddr_in &inet4 = reinterpret_cast<sockaddr_in &>(m_data);

sockaddr and sockaddr_in do not share alignment on all platforms (on Linux alignof(sockaddr) == 2 but alignof(sockaddr_in) == 4), so accessing the storage through a sockaddr_in glvalue is an alignment / strict-aliasing issue that UBSan reports.

2. Silent port truncation. port is an int cast to uint16_t with no range check:

inet4.sin_port = htons(static_cast<uint16_t>(port));

so out-of-range values wrap silently:

  • -1 → 65535
  • 65536 → 0
  • 99999 → 34463
Impact

This constructor is on the live server path: it has an addListeningPort caller (unlike the SocketAddr(char const *) overload, which has no in-repo caller). The string-parsing overload was made safe in #4292 (it memcpys a local sockaddr_in in and out of the storage and parses a strict decimal port); this integer constructor still uses the old reinterpret_cast access and the unchecked port cast.

Suggested fix

Mirror #4292's approach: build a local sockaddr_in, memcpy it into m_data, and validate or clamp the port range (or document the caller's contract that the port is already in 0..65535).

Context

Split out of the ext/http correctness audit (#4287). #4292 deliberately scoped this out to keep that PR limited to the string parser.

Lenguaje dominante
C++
Estrellas
1.4k
Forks
660
Merge medio
1 d 12 h
PR fusionados (30 d)
47

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de open-telemetry/opentelemetry-cpp

Todos los issues de open-telemetry/opentelemetry-cpp

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.