commit c97ecdc7810043f0721979fe1e788e29d402c7bd
parent 9f25c7a279bb5a56c6c8b95edab2d68d48d88ad3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 16 Oct 2023 15:49:46 +0200
Detect whether memory mapping is enabled when loading from stdin
In this case, print a specific error message at the start of the loading
procedure before any loading problems occur. To test this, we can now
provide the "-" option as an input argument to the test_smsh_load
program, which means "read data from stdin".
Diffstat:
2 files changed, 43 insertions(+), 21 deletions(-)
diff --git a/src/smsh.c b/src/smsh.c
@@ -32,6 +32,18 @@
/*******************************************************************************
* Helper functions
******************************************************************************/
+static INLINE int
+is_stdin(FILE* stream)
+{
+ struct stat stream_buf;
+ struct stat stdin_buf;
+ ASSERT(stream);
+
+ CHK(fstat(fileno(stream), &stream_buf) == 0);
+ CHK(fstat(STDIN_FILENO, &stdin_buf) == 0);
+ return stream_buf.st_dev == stdin_buf.st_dev;
+}
+
static INLINE res_T
check_smsh_create_args(const struct smsh_create_args* args)
{
@@ -47,9 +59,17 @@ check_smsh_load_args(const struct smsh_load_args* args)
}
static INLINE res_T
-check_smsh_load_stream_args(const struct smsh_load_stream_args* args)
+check_smsh_load_stream_args
+ (struct smsh* smsh,
+ const struct smsh_load_stream_args* args)
{
if(!args || !args->stream || !args->name) return RES_BAD_ARG;
+ if(args->memory_mapping && is_stdin(args->stream)) {
+ log_err(smsh,
+ "%s: unable to use memory mapping on data loaded from stdin\n",
+ args->name);
+ return RES_BAD_ARG;
+ }
return RES_OK;
}
@@ -80,18 +100,6 @@ reset_smsh(struct smsh* smsh)
smsh->map_len_cells = 0;
}
-static INLINE int
-is_stdin(FILE* stream)
-{
- struct stat stream_buf;
- struct stat stdin_buf;
- ASSERT(stream);
-
- CHK(fstat(fileno(stream), &stream_buf) == 0);
- CHK(fstat(STDIN_FILENO, &stdin_buf) == 0);
- return stream_buf.st_dev == stdin_buf.st_dev;
-}
-
static res_T
map_data
(struct smsh* smsh,
@@ -246,7 +254,7 @@ static res_T
load_stream(struct smsh* smsh, const struct smsh_load_stream_args* args)
{
res_T res = RES_OK;
- ASSERT(smsh && check_smsh_load_stream_args(args) == RES_OK);
+ ASSERT(smsh && check_smsh_load_stream_args(smsh, args) == RES_OK);
reset_smsh(smsh);
@@ -412,7 +420,7 @@ smsh_load_stream(struct smsh* smsh, const struct smsh_load_stream_args* args)
{
res_T res = RES_OK;
if(!smsh) return RES_BAD_ARG;
- res = check_smsh_load_stream_args(args);
+ res = check_smsh_load_stream_args(smsh, args);
if(res != RES_OK) return res;
return load_stream(smsh, args);
}
diff --git a/src/test_smsh_load.c b/src/test_smsh_load.c
@@ -21,6 +21,7 @@
#include <rsys/rsys.h>
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
/*******************************************************************************
@@ -237,7 +238,6 @@ test_load_fail(struct smsh* smsh)
static void
test_load_files(struct smsh* smsh, int argc, char** argv)
{
- struct smsh_load_args args = SMSH_LOAD_ARGS_NULL;
hash256_T hash;
int i;
CHK(smsh);
@@ -247,11 +247,25 @@ test_load_files(struct smsh* smsh, int argc, char** argv)
size_t inode;
size_t icell;
- printf("Load %s\n", argv[i]);
-
- args.path = argv[i];
- args.memory_mapping = 1;
- CHK(smsh_load(smsh, &args) == RES_OK);
+ /* Load from file */
+ if(strcmp(argv[i], "-") != 0) {
+ struct smsh_load_args args = SMSH_LOAD_ARGS_NULL;
+ printf("Load %s\n", argv[i]);
+ args.path = argv[i];
+ args.memory_mapping = 1;
+ CHK(smsh_load(smsh, &args) == RES_OK);
+
+ /* Load from stdin */
+ } else {
+ struct smsh_load_stream_args args = SMSH_LOAD_STREAM_ARGS_NULL;
+ printf("Load from stdin\n");
+ args.stream = stdin;
+ args.name = "stdin";
+ args.memory_mapping = 1;
+ CHK(smsh_load_stream(smsh, &args) == RES_BAD_ARG);
+ args.memory_mapping = 0;
+ CHK(smsh_load_stream(smsh, &args) == RES_OK);
+ }
CHK(smsh_get_desc(smsh, &desc) == RES_OK);
CHK(smsh_desc_compute_hash(&desc, hash) == RES_OK);