Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

P2: abort-rearm on a ship that is not being rearmed reads past the object array

Abierto Apto para principiantes
#7,917 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
76/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp
Área
game-dev

Línea de trabajo

Lee sexp_abort_rearm en sexp.cpp y compara cómo busca la nave de apoyo con el helper ai_abort_rearm_request existente en aicode.cpp. El issue describe tres posibles soluciones; comprueba el comportamiento del helper y las pruebas de rearmado pertinentes antes de elegir un enfoque. El trabajo estará terminado cuando abort-rearm no haga nada de forma segura si ninguna nave de apoyo está atendiendo a la nave indicada.

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

Descripción

Problem

The abort-rearm sexp crashes or corrupts memory when the ship it names is not currently being rearmed. Mission designers may reasonably use it to cancel a rearm "just in case", but if no support ship is servicing that ship, the sexp hands the repair code an object at index -1 and the repair code reads through it.

In sexp_abort_rearm (sexp.cpp), the support ship is looked up from the ship's AI info without checking that one is set, so &Objects[-1] is passed to ai_do_objects_repairing_stuff, which then walks that object's docking list.

Steps to reproduce

  1. FSO master (tested on 12a36dc1a with an ASan debug build; sexp.cpp, aicode.cpp and objectdock.cpp are unchanged on current master 76219fd1e), Linux, MediaVPs 5.0.2.
  2. Any mission with a ship that is not being rearmed (I used a GTF Myrmidon given a play-dead order).
  3. Run ( abort-rearm "<that ship>" ) from an event.

Expected vs. actual behavior

Expected: nothing happens, since there is no rearm to abort.

Actual: AddressSanitizer reports a global-buffer-overflow read in dock_find_instance (objectdock.cpp:1047), called from ai_do_objects_repairing_stuff (aicode.cpp:11378) and sexp_abort_rearm (sexp.cpp:15342). The address read is the slot just before the global object array. Without the sanitizer the result depends on whatever memory sits there.

Proposed fixes

  1. Skip ships with no support ship. In sexp_abort_rearm, continue to the next ship when support_ship_objnum is negative. One line, matches what the sexp promises.
  2. Guard inside the repair function. Have ai_do_objects_repairing_stuff ignore an abort when the repair object is invalid, which also protects any other caller.
  3. Route through the existing abort helper. Call ai_abort_rearm_request, which already handles the "nobody is servicing me" case, instead of calling the repair code directly.
Lenguaje dominante
C++
Estrellas
488
Forks
184
Merge medio
2 d 9 h
PR fusionados (30 d)
40

Preparar el entorno

Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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 scp-fs2open/fs2open.github.com

Todos los issues de scp-fs2open/fs2open.github.com

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.