DIV
DIV copied to clipboard
Detección problemática de rutas de fichero en cadenas
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.
¿Alguna idea de por que hace eso?
¿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.
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
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?)
Ya te digo, pantallazos azules por todas partes
Watcom incluye una función llamada access()
, no es estándar pero es más sencilla que stat()
¿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
Vale, se me acaban de ocurrir un par de cosas 😆:
- Utilizar siempre un archivo de texto, algo tipo
MANIFEST.TXT
oPACKAGE.TXT
. - O bien, utilizar
compiler_options
con algo del estilo:
compiler_options _package="archivos.txt";
program whatever
global
...
begin
...
end
¿Qué os parece?
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.