From 8929afc887a1bfd554fa1e962f6f5e064116fec1 Mon Sep 17 00:00:00 2001 From: manni07 Date: Mon, 2 Mar 2026 23:18:03 +0100 Subject: [PATCH] fix(HIGH-02): add realpath() validation for data and model paths - train_large.m: realpath() guard for DATA_PATH before open() provides clear error message when run from wrong directory - train_large.m: realpath() audit log in load_pretrained() for model path ref: docs/reports/security-audit-2026-03-02.md HIGH-02 --- training/train_large.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/training/train_large.m b/training/train_large.m index 198f57b..1f6860f 100644 --- a/training/train_large.m +++ b/training/train_large.m @@ -4,6 +4,7 @@ #include "stories_io.h" #include "stories_mil.h" #include "stories_cpu_ops.h" +#include // PATH_MAX for realpath() (HIGH-02) #define CKPT_PATH "ane_stories110M_ckpt.bin" #define MODEL_PATH "../../assets/models/stories110M.bin" @@ -13,6 +14,7 @@ static bool load_pretrained(LayerWeights *lw, float *rms_final, float *embed, const char *path) { FILE *f = fopen(path, "rb"); if (!f) { printf("Cannot open %s\n", path); return false; } + { char rp[PATH_MAX]; if (realpath(path, rp)) printf(" Model path: %s\n", rp); } // HIGH-02: audit resolved path Llama2Config cfg; // Validate config read — gatekeeper before any dimension-based logic (CRIT-03) if (fread(&cfg, sizeof(cfg), 1, f) != 1) { @@ -289,6 +291,15 @@ int main(int argc, char *argv[]) { } // mmap token data + // HIGH-02: validate DATA_PATH resolves before open() to give a clear error when CWD is wrong + { + char rp[PATH_MAX]; + if (!realpath(DATA_PATH, rp)) { + fprintf(stderr, "Data file not found: '%s'\n" + " Hint: run train_large from the training/ directory.\n", DATA_PATH); + return 1; + } + } int data_fd = open(DATA_PATH, O_RDONLY); if (data_fd < 0) { printf("Cannot open %s\n", DATA_PATH); return 1; } struct stat st; fstat(data_fd, &st);