The builtins wasnt protected, now all data received is protected, the hashmap addition is protected and added functionality of env, export and unset (not implemented in this version). Added fixed details documentation in docs/builtins_fixes.md generated by codex and created tests/builtins_edge_cases.sh to test all the builtins to work correctly
5.7 KiB
5.7 KiB
Correcciones en Builtins
Este documento resume los fallos detectados en los builtins actuales y la solucion aplicada en codigo.
1) Infraestructura de builtins (include/builtins.h, src/builtins/builtins.c)
Fallo
- Uso inconsistente de tipos (
u_int8_t/unsigned charfrente auint8_t). set_builtinsno comprobaba fallos de registro por builtin (duplicado de clave o insercion en hashmap), pudiendo dejar estado parcial.is_builtinpodia dereferenciar punteros nulos.
Por que fallaba
u_int8_tno es el tipo estandar C99 y depende de plataforma/headers.- Si falla una insercion, la tabla quedaba inicializada parcialmente sin rollback.
- En errores de inicializacion, consultar
is_builtinpodia romper.
Solucion
- Unificacion de firmas a
uint8_t. - Nuevo helper
register_builtin()con validacion trasft_hashmap_put. - Si falla cualquier alta: limpieza de
minishell->builtinsy retorno de error. - Guardas nulas en
is_builtin.
2) cd (src/builtins/cd/cd.c)
Fallo
cdcon demasiados argumentos devolvia2(bash devuelve1).cdsinHOMEacababa llamando achdir(NULL).- El manejo de error usaba comprobaciones invertidas (
access) y codigos incorrectos. - No se actualizaban
PWDyOLDPWDtraschdirexitoso. cd -(usarOLDPWD) no estaba soportado.
Por que fallaba
- Codigos de salida incompatibles con el comportamiento esperado del shell.
HOMEno definido no se controlaba antes delchdir.- La logica de
accessestaba al reves y mezclaba condiciones. - Variables de entorno del directorio quedaban desincronizadas.
- Faltaba resolver el caso especial de
-haciaOLDPWD.
Solucion
- Refactor en
resolve_cd_path()para validar argumentos yHOME. - Retorno
EXIT_FAILUREentoo many argumentsyHOME not set. - Error de
chdirsimplificado aperror("minishell: cd")+ retorno1. - Actualizacion de
OLDPWDyPWDmediantegetcwd(NULL, 0)+set_env(). - Soporte de
cd -: usaOLDPWD, validaOLDPWD not sete imprime el nuevo directorio tras el cambio.
3) exit (src/builtins/exit/exit.c)
Fallo
- Habia un
printfde debug en ejecucion real. exit <no_numerico>devolvia2pero no cerraba el shell.exit n mdevolvia2; en bash es1y no sale del shell.- Validacion numerica basada en
ft_strisnumsin control de overflow. - Se mostraba
exitincluso en contexto no interactivo.
Por que fallaba
- Debug residual contamina salida.
- Semantica de
exitincompleta respecto a bash. - Valores fuera de rango podian tratarse como validos por conversion directa.
- Mensaje
exitdebe mostrarse solo en shell interactivo.
Solucion
- Eliminado debug print.
- Nuevo flujo
resolve_exit_status():- Sin argumentos: usa
msh->exit_status. - Argumento no numerico o fuera de
long: mensajenumeric argument required,msh->exit = true, estado2. - Demasiados argumentos: mensaje de error y estado
1, sin salir.
- Sin argumentos: usa
- Parser numerico propio (
get_uint8_from_num+has_overflow) con soporte de signo y control de overflow. ft_eputendl("exit")solo siisatty(STDIN_FILENO).
4) pwd (src/builtins/pwd/pwd.c)
Fallo
- Si
getcwdfallaba, el builtin devolviaEXIT_SUCCESS. - Uso de buffer fijo (
PATH_MAX) menos robusto para rutas largas.
Por que fallaba
- El shell reportaba exito aunque no pudiera obtener el directorio.
- Un buffer fijo puede truncar o fallar en escenarios de rutas profundas.
Solucion
- Cambio a
getcwd(NULL, 0)con memoria dinamica. - Si falla,
perror("minishell: pwd")y retornoEXIT_FAILURE. free()del buffer dinamico tras imprimir.
5) echo (src/builtins/echo/echo.c, src/builtins/echo/echo_def.c)
Cambio aplicado
- Ajuste de tipos de retorno auxiliares a
uint8_tpara mantener consistencia conbuiltins.h.
Nota
- No se detectaron fallos funcionales criticos adicionales en la logica actual
de
echodurante esta revision.
6) Builtins faltantes: env, export, unset
Fallo
- Los builtins
env,exportyunsetno estaban implementados ni registrados enset_builtins.
Por que fallaba
- Comandos basicos de shell no existian en la tabla de builtins.
- Cualquier prueba/flujo que dependiera de gestion de variables exportadas fallaba (listar, crear y eliminar variables de entorno).
Solucion
- Nuevos builtins implementados:
src/builtins/env/env.csrc/builtins/export/export.csrc/builtins/unset/unset.c
- Registro en
src/builtins/builtins.c(tabla ampliada de 4 a 7 entradas). - Nuevos prototipos en
include/builtins.h. - Soporte de borrado real de entorno mediante
unset_env:- Declaracion en
include/core.h - Implementacion en
src/variables/environment_unset.c
- Declaracion en
7) Comportamiento aplicado en los nuevos builtins
env
- Si recibe argumentos, devuelve error (
minishell: env: too many arguments) y estado1. - Sin argumentos, lista
KEY=VALUEde las variables de entorno actuales.
export
export NAME=VALUE: crea/actualiza la variable.export NAME: crea/actualiza con valor vacio (NAME=) para que aparezca enenv.- Identificadores invalidos (
1A=2, etc.) devuelven errornot a valid identifiery estado1. - Sin argumentos, reutiliza el listado de
env.
unset
- Elimina variables validas del entorno en memoria.
- Identificadores invalidos devuelven error
not a valid identifiery estado1. - Si el identificador es valido y no existe, no falla (comportamiento shell).
Validacion realizada
norminetteejecutado sobre los archivos modificados:OK.- Build completa no ejecutable en este entorno por falta de acceso de red al
clonado de librerias (
github.com), por lo que no se pudo validar runtime del binario en esta sesion.