Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detección problemática de rutas de fichero en cadenas #17

Open
vii1 opened this issue Jun 25, 2019 · 9 comments
Open

Detección problemática de rutas de fichero en cadenas #17

vii1 opened this issue Jun 25, 2019 · 9 comments
Labels
Milestone

Comments

@vii1
Copy link
Owner

vii1 commented Jun 25, 2019

Al compilar, DIV recorre TODAS LAS CADENAS en un PRG y trata de comprobar si son rutas a ficheros existentes (con fopen si no recuerdo mal). Esto puede provocar PROBLEMAS GORDOS en la mayoría de plataformas (si no todas).

  • DOS y Win9x (y puede que algunas versiones de WinNT) son vulnerables al "bug CON". Intentar abrir un dispositivo mediante su nombre reservado (CON, LPT1, NUL, PRN, etc) provocará un bloqueo del sistema.
  • En sistemas modernos, tanto Unix como Windows, esto sigue siendo un agujero de seguridad más que evidente (¿programas que te roban información cuando pulsas F10? yupiiiii)
  • Incluso teniendo la seguridad en cuenta, hacer fopen a lo loco en sistemas Unix puede explotar si intentas abrir una carpeta, un fichero de tipo especial, un dispositivo…

Posible solución: usar stat() o un equivalente en lugar de fopen() ???

Y ya puestos, una mejora muy guapa sería dar libertad al usuario para decidir qué archivos se incluyen en la instalación de su juego y cuáles no. Eso lo dejamos para un futuro.

@vii1 vii1 added the bug label Jun 25, 2019
@vii1 vii1 added this to the Versión 2.02 milestone Jun 25, 2019
@vii1 vii1 changed the title Implementar una alternativa a la detección de rutas de fichero en cadenas Detección problemática de rutas de fichero en cadenas Jun 25, 2019
@Zardoz89
Copy link
Contributor

Zardoz89 commented Oct 6, 2020

¿Alguna idea de por que hace eso?

@vii1
Copy link
Owner Author

vii1 commented Oct 6, 2020

¿Alguna idea de por que hace eso?

Je, pensaba que lo había explicado en el post original pero no.

Lo hace para detectar a qué ficheros hace referencia el juego y deberían ser incluidos en el instalador. El compilador coge cada literal de cadena, le intenta hacer un fopen() y si no da error es que es un fichero existente y lo añade a una lista para que el creador de instalaciones lo incluya en el PAK.

Por eso, si cargas un fichero con un nombre generado en tiempo de ejecución, como load_map(“nivel”+nivel+”.map”); el compilador no lo detectará y tus mapas no se incluirán en el instalador. Por eso algunos juegos declaran un array con nombres de fichero sólo para esto. Creo que el Tokenkai lo hace.

@Zardoz89
Copy link
Contributor

Zardoz89 commented Oct 6, 2020

Estaría bien directamente quitar eso, y poder pasarle una lista de archivos en texto plano. Al menos eso funcionaria bien si solo hace falta para el instalador

@ferminho
Copy link

ferminho commented Oct 7, 2020

Madre mía vaya agujerazo de seguridad guapo... ahora estoy recordando expedientes X en la época con llamar a las cadenas con contenidos peculiares ("con/con" anyone?)

@vii1
Copy link
Owner Author

vii1 commented Oct 7, 2020

Ya te digo, pantallazos azules por todas partes

@vii1
Copy link
Owner Author

vii1 commented Mar 4, 2022

Watcom incluye una función llamada access(), no es estándar pero es más sencilla que stat()

@AzazelN28
Copy link
Collaborator

AzazelN28 commented Mar 9, 2022

¿Qué os parecería meter algo de este estilo?

program whatever;
package
  "wld/wld_view.wld";
  "wld/wld_view.fpg";

global
  // ...
local
  // ...
private
  // ...
begin

end

Ventajas:

  • Declarativo
  • Sintaxis más o menos sencilla (y creo que no costaría mucho incluirlo en divc.cpp)

Desventajas:

  • Rompe la compatibilidad por completo con DIV 2 original
  • Puede que sea un poco rollo si tienes que incluir muchos archivos

Otra opción sería poder pasarle un archivo que contenga esa lista, algo como:

program whatever;
package "files.txt"
  ...
begin
  ...
end

@AzazelN28
Copy link
Collaborator

AzazelN28 commented Mar 9, 2022

Vale, se me acaban de ocurrir un par de cosas 😆:

  1. Utilizar siempre un archivo de texto, algo tipo MANIFEST.TXT o PACKAGE.TXT.
  2. O bien, utilizar compiler_options con algo del estilo:
compiler_options _package="archivos.txt";
program whatever
global
  ...
begin
  ...
end

¿Qué os parece?

@Zardoz89
Copy link
Contributor

Yo veo mejor la solución de un fichero de texto con un compiler_options. Si no se usa esa opción, se mantiene el comportamiento original. Así no rompes la compatibilidad con DIV2 ni para generar los instaladores.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants