DIV icon indicating copy to clipboard operation
DIV copied to clipboard

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

Open vii1 opened this issue 5 years ago • 9 comments

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 avatar Jun 25 '19 07:06 vii1

¿Alguna idea de por que hace eso?

Zardoz89 avatar Oct 06 '20 18:10 Zardoz89

¿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.

vii1 avatar Oct 06 '20 19:10 vii1

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

Zardoz89 avatar Oct 06 '20 19:10 Zardoz89

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?)

ferminho avatar Oct 07 '20 15:10 ferminho

Ya te digo, pantallazos azules por todas partes

vii1 avatar Oct 07 '20 15:10 vii1

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

vii1 avatar Mar 04 '22 16:03 vii1

¿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 avatar Mar 09 '22 21:03 AzazelN28

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?

AzazelN28 avatar Mar 09 '22 21:03 AzazelN28

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.

Zardoz89 avatar Mar 13 '22 07:03 Zardoz89