From 654941f222a4aa09bc33213ef7c37c5d94af1b46 Mon Sep 17 00:00:00 2001 From: msutovsky-r7 Date: Thu, 19 Feb 2026 11:33:26 +0100 Subject: [PATCH 1/2] Adds base for nested mkdir --- mettle/src/stdapi/fs/file.c | 52 +++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/mettle/src/stdapi/fs/file.c b/mettle/src/stdapi/fs/file.c index 48917325..eb53ad64 100644 --- a/mettle/src/stdapi/fs/file.c +++ b/mettle/src/stdapi/fs/file.c @@ -543,12 +543,59 @@ fs_cb(eio_req *req) struct tlv_packet * fs_mkdir(struct tlv_handler_ctx *ctx) { - const char *path = tlv_packet_get_str(ctx->req, TLV_TYPE_DIRECTORY_PATH); + char * dir; + char * base_dir; + char * tmp; + struct stat f_info; + char * path_dup; + char *path = tlv_packet_get_str(ctx->req, TLV_TYPE_DIRECTORY_PATH); + if (path == NULL) { return tlv_packet_response_result(ctx, TLV_RESULT_EINVAL); } + path_dup = strdup(path); - eio_mkdir(path, 0777, 0, fs_cb, ctx); + // take into account null byte at the end of path and the one we add in sprintf + base_dir = malloc(strlen(path_dup)+2); + tmp = malloc(strlen(path_dup)+2); + dir = strtok(path_dup, "/"); + + //address absolute paths — check original path since strtok modifies path_dup + if (path[0] == '/') + { + sprintf(base_dir, "/%s/", dir); + } + else + { + sprintf(base_dir, "%s/", dir); + } + + while(dir != NULL) + { + #ifdef _WIN32 + if(stat(base_dir, &f_info) != 0) + #else + if(lstat(base_dir, &f_info) != 0) + #endif + { + eio_mkdir(base_dir, 0777, 0, NULL, NULL); + } + memset(&f_info, 0, sizeof(struct stat)); + dir = strtok(NULL, "/"); + if(dir != NULL) + { + sprintf(tmp, "%s%s/", base_dir, dir); + strcpy(base_dir, tmp); + } + } + + struct tlv_packet *p = tlv_packet_response_result(ctx,TLV_RESULT_SUCCESS); + + tlv_dispatcher_enqueue_response(ctx->td, p); + tlv_handler_ctx_free(ctx); + free(tmp); + free(base_dir); + free(path_dup); return NULL; } @@ -887,3 +934,4 @@ void file_register_handlers(struct mettle *m) }; channelmgr_add_channel_type(cm, "stdapi_fs_file", &cbs); } + From 80b6b626b2cc94b936f9bee1275db66cec5752e2 Mon Sep 17 00:00:00 2001 From: msutovsky-r7 Date: Thu, 9 Apr 2026 10:19:57 +0200 Subject: [PATCH 2/2] Adds additional checks for mkdir execution --- mettle/src/stdapi/fs/file.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mettle/src/stdapi/fs/file.c b/mettle/src/stdapi/fs/file.c index eb53ad64..2a008976 100644 --- a/mettle/src/stdapi/fs/file.c +++ b/mettle/src/stdapi/fs/file.c @@ -553,11 +553,31 @@ fs_mkdir(struct tlv_handler_ctx *ctx) if (path == NULL) { return tlv_packet_response_result(ctx, TLV_RESULT_EINVAL); } + path_dup = strdup(path); + if (path_dup == NULL) { + return tlv_packet_response_result(ctx, TLV_RESULT_ENOMEM); + } + // take into account null byte at the end of path and the one we add in sprintf base_dir = malloc(strlen(path_dup)+2); + + if(base_dir == NULL) + { + free(path_dup); + return tlv_packet_response_result(ctx, TLV_RESULT_ENOMEM); + } + tmp = malloc(strlen(path_dup)+2); + + if(tmp == NULL) + { + free(path_dup); + free(base_dir); + return tlv_packet_response_result(ctx, TLV_RESULT_ENOMEM); + } + dir = strtok(path_dup, "/"); //address absolute paths — check original path since strtok modifies path_dup @@ -578,7 +598,13 @@ fs_mkdir(struct tlv_handler_ctx *ctx) if(lstat(base_dir, &f_info) != 0) #endif { - eio_mkdir(base_dir, 0777, 0, NULL, NULL); + if(!eio_mkdir(base_dir, 0777, 0, NULL, NULL)) + { + free(path_dup); + free(base_dir); + free(tmp); + return tlv_packet_response_result(ctx, errno); + } } memset(&f_info, 0, sizeof(struct stat)); dir = strtok(NULL, "/");