From e7ddb294b84a2f012019d11f9fa5fad90dc304e5 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 2 Apr 2016 11:42:02 -0400 Subject: slbt_reset_arguments(): initial implementation and integration. --- include/slibtool/slibtool.h | 1 + src/logic/slbt_exec_ctx.c | 32 ++++++++++++++++++++++++++++++-- src/logic/slbt_exec_link.c | 3 +++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index a9dbf6e..c5100b9 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -180,6 +180,7 @@ slbt_api void slbt_free_unit_ctx (struct slbt_unit_ctx *); slbt_api int slbt_get_exec_ctx (const struct slbt_driver_ctx *, struct slbt_exec_ctx **); slbt_api void slbt_free_exec_ctx (struct slbt_exec_ctx *); +slbt_api void slbt_reset_arguments (struct slbt_exec_ctx *); slbt_api void slbt_reset_placeholders (struct slbt_exec_ctx *); slbt_api int slbt_exec_compile (const struct slbt_driver_ctx *, struct slbt_exec_ctx *); diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c index 1fbcca3..3eec822 100644 --- a/src/logic/slbt_exec_ctx.c +++ b/src/logic/slbt_exec_ctx.c @@ -16,6 +16,8 @@ struct slbt_exec_ctx_impl { int argc; char * args; + char * shadow; + size_t size; struct slbt_exec_ctx ctx; char * vbuffer[]; }; @@ -57,8 +59,10 @@ static struct slbt_exec_ctx_impl * slbt_exec_ctx_alloc( { struct slbt_exec_ctx_impl * ictx; size_t size; + size_t vsize; int argc; char * args; + char * shadow; char * csrc; char ** parg; @@ -102,16 +106,25 @@ static struct slbt_exec_ctx_impl * slbt_exec_ctx_alloc( if (!(args = malloc(size))) return 0; - size = sizeof(*ictx) + (2*(argc+1)+SLBT_ARGV_SPARE_PTRS)*sizeof(char *); + if (!(shadow = malloc(size))) { + free(args); + return 0; + } + + vsize = sizeof(*ictx) + (2*(argc+1)+SLBT_ARGV_SPARE_PTRS)*sizeof(char *); - if (!(ictx = calloc(1,size))) { + if (!(ictx = calloc(1,vsize))) { free(args); + free(shadow); return 0; } ictx->args = args; ictx->argc = argc; + ictx->size = size; + ictx->shadow = shadow; + ictx->ctx.csrc = csrc; return ictx; @@ -269,6 +282,9 @@ int slbt_get_exec_ctx( + sizeof('\0'); } + /* argument strings shadow copy */ + memcpy(ictx->shadow,ictx->args,ictx->size); + *ectx = &ictx->ctx; return 0; } @@ -279,6 +295,7 @@ static int slbt_free_exec_ctx_impl( int status) { free(ictx->args); + free(ictx->shadow); free (ictx); return status; } @@ -297,6 +314,17 @@ void slbt_free_exec_ctx(struct slbt_exec_ctx * ctx) } +void slbt_reset_arguments(struct slbt_exec_ctx * ectx) +{ + struct slbt_exec_ctx_impl * ictx; + uintptr_t addr; + + addr = (uintptr_t)ectx - offsetof(struct slbt_exec_ctx_impl,ctx); + ictx = (struct slbt_exec_ctx_impl *)addr; + memcpy(ictx->args,ictx->shadow,ictx->size); +} + + void slbt_reset_placeholders(struct slbt_exec_ctx * ectx) { *ectx->dpic = "-USLIBTOOL_PLACEHOLDER_DPIC"; diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 1739c63..9c07517 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -58,6 +58,9 @@ static int slbt_exec_link_static_archive( char program[PATH_MAX]; char output [PATH_MAX]; + /* initial state */ + slbt_reset_arguments(ectx); + /* placeholders */ slbt_reset_placeholders(ectx); -- cgit v1.2.3