aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-06-21 12:57:12 +0100
committerRon Yorston <rmy@pobox.com>2020-06-21 12:57:12 +0100
commit4f4e9e0d3366ec607d8765278b9753e41bdd544f (patch)
tree6cd961798e45b2f891a5bf1541be6cb94f01e410
parent53aca1b56db730b0103f5ec2e692327237a775e2 (diff)
downloadbusybox-w32-4f4e9e0d3366ec607d8765278b9753e41bdd544f.tar.gz
busybox-w32-4f4e9e0d3366ec607d8765278b9753e41bdd544f.tar.bz2
busybox-w32-4f4e9e0d3366ec607d8765278b9753e41bdd544f.zip
ash: skip NULL argv during forkshell
Alter argv_size()/argv_copy() to omit argv from the forkshell block if it's NULL. Improve forkshell debug code to properly account for parts of funcblock which aren't being used.
-rw-r--r--shell/ash.c111
1 files changed, 44 insertions, 67 deletions
diff --git a/shell/ash.c b/shell/ash.c
index decd6c0f7..b51a3fb82 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -15824,12 +15824,14 @@ atab_copy(struct alias **atabp)
15824static struct datasize 15824static struct datasize
15825argv_size(struct datasize ds, char **p) 15825argv_size(struct datasize ds, char **p)
15826{ 15826{
15827 while (p && *p) { 15827 if (p) {
15828 while (*p) {
15829 ds.funcblocksize += sizeof(char *);
15830 ds.funcstringsize += align_len(*p);
15831 p++;
15832 }
15828 ds.funcblocksize += sizeof(char *); 15833 ds.funcblocksize += sizeof(char *);
15829 ds.funcstringsize += align_len(*p);
15830 p++;
15831 } 15834 }
15832 ds.funcblocksize += sizeof(char *);
15833 return ds; 15835 return ds;
15834} 15836}
15835 15837
@@ -15841,17 +15843,20 @@ argv_copy(char **p)
15841 int i = 0; 15843 int i = 0;
15842#endif 15844#endif
15843 15845
15844 while (p && *p) { 15846 if (p) {
15847 while (*p) {
15848 new = funcblock;
15849 funcblock = (char *) funcblock + sizeof(char *);
15850 *new = nodeckstrdup(*p);
15851 SAVE_PTR(*new, xasprintf("argv[%d] '%s'", i++, *p), FREE);
15852 p++;
15853 }
15845 new = funcblock; 15854 new = funcblock;
15846 funcblock = (char *) funcblock + sizeof(char *); 15855 funcblock = (char *) funcblock + sizeof(char *);
15847 *new = nodeckstrdup(*p); 15856 *new = NULL;
15848 SAVE_PTR(*new, xasprintf("argv[%d] '%s'", i++, *p), FREE); 15857 return start;
15849 p++;
15850 } 15858 }
15851 new = funcblock; 15859 return NULL;
15852 funcblock = (char *) funcblock + sizeof(char *);
15853 *new = NULL;
15854 return start;
15855} 15860}
15856 15861
15857#if MAX_HISTORY 15862#if MAX_HISTORY
@@ -16069,6 +16074,7 @@ forkshell_copy(struct forkshell *fs, struct forkshell *new)
16069 16074
16070#if FORKSHELL_DEBUG 16075#if FORKSHELL_DEBUG
16071/* fp and notes can each be NULL */ 16076/* fp and notes can each be NULL */
16077#define NUM_BLOCKS 7
16072static void 16078static void
16073forkshell_print(FILE *fp0, struct forkshell *fs, const char **notes) 16079forkshell_print(FILE *fp0, struct forkshell *fs, const char **notes)
16074{ 16080{
@@ -16077,8 +16083,10 @@ forkshell_print(FILE *fp0, struct forkshell *fs, const char **notes)
16077 char *lfuncstring; 16083 char *lfuncstring;
16078 char *lrelocate; 16084 char *lrelocate;
16079 char *s; 16085 char *s;
16080 int count, i; 16086 int count, i, total;
16081 int size_gvp, size_gmp, size_cmdtable, size_atab, size_history, total; 16087 int size[NUM_BLOCKS];
16088 char *lptr[NUM_BLOCKS+1];
16089 enum {GVP, GMP, CMDTABLE, NODE, ARGV, ATAB, HISTORY, FUNCSTRING};
16082 const char *fsname[] = { 16090 const char *fsname[] = {
16083 "FS_OPENHERE", 16091 "FS_OPENHERE",
16084 "FS_EVALBACKCMD", 16092 "FS_EVALBACKCMD",
@@ -16112,60 +16120,29 @@ forkshell_print(FILE *fp0, struct forkshell *fs, const char **notes)
16112 16120
16113 /* funcblocksize is zero for FS_OPENHERE */ 16121 /* funcblocksize is zero for FS_OPENHERE */
16114 if (fs->funcblocksize != 0) { 16122 if (fs->funcblocksize != 0) {
16115 size_gvp = (int)((char *)fs->gmp-(char *)fs->gvp); 16123 /* Depending on the configuration and the type of forkshell
16116 size_gmp = (int)((char *)fs->cmdtable-(char *)fs->gmp); 16124 * some items may not be present. */
16117#if ENABLE_ASH_ALIAS && MAX_HISTORY 16125 lptr[FUNCSTRING] = lfuncstring;
16118 if (fs->atab) { 16126#if MAX_HISTORY
16119 size_cmdtable = (int)((char *)fs->atab-(char *)fs->cmdtable); 16127 lptr[HISTORY] = fs->history ? (char *)fs->history : lptr[FUNCSTRING];
16120 if (fs->history) {
16121 size_atab = (int)((char *)fs->history-(char *)fs->atab);
16122 size_history = (int)(lfuncstring-(char *)fs->history);
16123 }
16124 else {
16125 size_atab = (int)(lfuncstring-(char *)fs->atab);
16126 size_history = 0;
16127 }
16128 }
16129 else {
16130 size_atab = 0;
16131 if (fs->history) {
16132 size_cmdtable = (int)((char *)fs->history-(char *)fs->cmdtable);
16133 size_history = (int)(lfuncstring-(char *)fs->history);
16134 }
16135 else {
16136 size_cmdtable = (int)(lfuncstring-(char *)fs->cmdtable);
16137 size_history = 0;
16138 }
16139 }
16140#elif ENABLE_ASH_ALIAS
16141 size_history = 0;
16142 if (fs->atab) {
16143 size_cmdtable = (int)((char *)fs->atab-(char *)fs->cmdtable);
16144 size_atab = (int)(lfuncstring-(char *)fs->atab);
16145 }
16146 else {
16147 size_cmdtable = (int)(lfuncstring-(char *)fs->cmdtable);
16148 size_atab = 0;
16149 }
16150#elif MAX_HISTORY
16151 size_atab = 0;
16152 if (fs->history) {
16153 size_cmdtable = (int)((char *)fs->history-(char *)fs->cmdtable);
16154 size_history = (int)(lfuncstring-(char *)fs->history);
16155 }
16156 else {
16157 size_cmdtable = (int)(lfuncstring-(char *)fs->cmdtable);
16158 size_history = 0;
16159 }
16160#else 16128#else
16161 size_cmdtable = (int)(lfuncstring-(char *)fs->cmdtable); 16129 lptr[HISTORY] = lptr[FUNCSTRING];
16162 size_atab = 0; 16130#endif
16163 size_history = 0; 16131 lptr[ATAB] = IF_ASH_ALIAS(fs->atab ? (char *)fs->atab :) lptr[HISTORY];
16164#endif 16132 lptr[ARGV] = fs->argv ? (char *)fs->argv : lptr[ATAB];
16165 total = size_gvp + size_gmp + size_cmdtable + size_atab + size_history; 16133 lptr[NODE] = fs->n ? (char *)fs->n : lptr[ARGV];
16166 fprintf(fp, "funcblocksize %6d = %d + %d + %d + %d + %d = %d\n\n", 16134 lptr[CMDTABLE] = (char *)fs->cmdtable;
16167 fs->funcblocksize, size_gvp, size_gmp, size_cmdtable, 16135 lptr[GMP] = (char *)fs->gmp;
16168 size_atab, size_history, total); 16136 lptr[GVP] = (char *)fs->gvp;
16137
16138 fprintf(fp, "funcblocksize %6d = ", fs->funcblocksize);
16139 total = 0;
16140 for (i=0; i<NUM_BLOCKS; ++i) {
16141 size[i] = (int)(lptr[i+1] - lptr[i]);
16142 total += size[i];
16143 fprintf(fp, "%d %c ", size[i], i == NUM_BLOCKS - 1 ? '=' : '+');
16144 }
16145 fprintf(fp, "%d\n\n", total);
16169 } 16146 }
16170 else { 16147 else {
16171 fprintf(fp, "\n"); 16148 fprintf(fp, "\n");