aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-01-18 10:03:41 +0000
committerRon Yorston <rmy@pobox.com>2020-01-18 10:03:41 +0000
commit8e3dd0852bb87a41705cdd1fa0bf5336f1df4c1c (patch)
tree5f1730d431fa9c9002033f0c6ceceda1065e2227
parentdf87b596a3c4f404a06b3e902f9e085980ca62e0 (diff)
downloadbusybox-w32-8e3dd0852bb87a41705cdd1fa0bf5336f1df4c1c.tar.gz
busybox-w32-8e3dd0852bb87a41705cdd1fa0bf5336f1df4c1c.tar.bz2
busybox-w32-8e3dd0852bb87a41705cdd1fa0bf5336f1df4c1c.zip
ash: relocatesize may differ from forkshell block size
Currently the size of the relocate map is equal to the size of the forkshell struct plus funcblock and funcstring. This may not always be the case so record the size of the map separately. This doesn't affect the size of the binary.
-rw-r--r--shell/ash.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 853fafcc1..8e80a5228 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -360,12 +360,12 @@ struct forkshell {
360 /* struct parsefile *g_parsefile; */ 360 /* struct parsefile *g_parsefile; */
361 HANDLE hMapFile; 361 HANDLE hMapFile;
362 char *old_base; 362 char *old_base;
363 int size;
363# if FORKSHELL_DEBUG 364# if FORKSHELL_DEBUG
364 int funcblocksize; 365 int funcblocksize;
365 int funcstringsize; 366 int funcstringsize;
366 int relocatesize;
367# endif 367# endif
368 int size; 368 int relocatesize;
369 369
370 /* type of forkshell */ 370 /* type of forkshell */
371 int fpid; 371 int fpid;
@@ -15972,7 +15972,8 @@ forkshell_print(FILE *fp0, struct forkshell *fs, const char **notes)
15972 15972
15973 total = sizeof(struct forkshell) + fs->funcblocksize + 15973 total = sizeof(struct forkshell) + fs->funcblocksize +
15974 fs->funcstringsize + fs->relocatesize; 15974 fs->funcstringsize + fs->relocatesize;
15975 fprintf(fp, "total size %6d = %d + %d + %d + %d = %d\n", 2*fs->size, 15975 fprintf(fp, "total size %6d = %d + %d + %d + %d = %d\n",
15976 fs->size + fs->relocatesize,
15976 (int)sizeof(struct forkshell), fs->funcblocksize, 15977 (int)sizeof(struct forkshell), fs->funcblocksize,
15977 fs->funcstringsize, fs->relocatesize, total); 15978 fs->funcstringsize, fs->relocatesize, total);
15978 15979
@@ -16051,7 +16052,7 @@ static struct forkshell *
16051forkshell_prepare(struct forkshell *fs) 16052forkshell_prepare(struct forkshell *fs)
16052{ 16053{
16053 struct forkshell *new; 16054 struct forkshell *new;
16054 int size; 16055 int size, relocatesize;
16055 HANDLE h; 16056 HANDLE h;
16056 SECURITY_ATTRIBUTES sa; 16057 SECURITY_ATTRIBUTES sa;
16057#if FORKSHELL_DEBUG 16058#if FORKSHELL_DEBUG
@@ -16069,6 +16070,7 @@ forkshell_prepare(struct forkshell *fs)
16069 16070
16070 /* calculate size of structure, funcblock and funcstring */ 16071 /* calculate size of structure, funcblock and funcstring */
16071 size = sizeof(struct forkshell) + forkshell_size(fs); 16072 size = sizeof(struct forkshell) + forkshell_size(fs);
16073 relocatesize = size;
16072 16074
16073 /* Allocate shared memory region. We allocate twice 'size' to allow 16075 /* Allocate shared memory region. We allocate twice 'size' to allow
16074 * for the relocation map. This is an overestimate as the relocation 16076 * for the relocation map. This is an overestimate as the relocation
@@ -16078,7 +16080,8 @@ forkshell_prepare(struct forkshell *fs)
16078 sa.nLength = sizeof(sa); 16080 sa.nLength = sizeof(sa);
16079 sa.lpSecurityDescriptor = NULL; 16081 sa.lpSecurityDescriptor = NULL;
16080 sa.bInheritHandle = TRUE; 16082 sa.bInheritHandle = TRUE;
16081 h = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, 2*size, NULL); 16083 h = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0,
16084 size+relocatesize, NULL);
16082 16085
16083 /* Initialise pointers */ 16086 /* Initialise pointers */
16084 new = (struct forkshell *)MapViewOfFile(h, FILE_MAP_WRITE, 0,0, 0); 16087 new = (struct forkshell *)MapViewOfFile(h, FILE_MAP_WRITE, 0,0, 0);
@@ -16086,7 +16089,7 @@ forkshell_prepare(struct forkshell *fs)
16086 funcblock = (char *)(new + 1); 16089 funcblock = (char *)(new + 1);
16087 funcstring_end = relocate = (char *)new + size; 16090 funcstring_end = relocate = (char *)new + size;
16088#if FORKSHELL_DEBUG 16091#if FORKSHELL_DEBUG
16089 annot = (const char **)xzalloc(sizeof(char *)*size); 16092 annot = (const char **)xzalloc(sizeof(char *)*relocatesize);
16090#endif 16093#endif
16091 16094
16092 /* Now pack them all */ 16095 /* Now pack them all */
@@ -16094,6 +16097,7 @@ forkshell_prepare(struct forkshell *fs)
16094 16097
16095 /* Finish it up */ 16098 /* Finish it up */
16096 new->size = size; 16099 new->size = size;
16100 new->relocatesize = relocatesize;
16097 new->old_base = (char *)new; 16101 new->old_base = (char *)new;
16098 new->hMapFile = h; 16102 new->hMapFile = h;
16099#if FORKSHELL_DEBUG 16103#if FORKSHELL_DEBUG
@@ -16103,7 +16107,6 @@ forkshell_prepare(struct forkshell *fs)
16103 16107
16104 new->funcblocksize = (char *)funcblock - (char *)(new + 1); 16108 new->funcblocksize = (char *)funcblock - (char *)(new + 1);
16105 new->funcstringsize = (char *)new + size - funcstring_end; 16109 new->funcstringsize = (char *)new + size - funcstring_end;
16106 new->relocatesize = size;
16107 16110
16108 /* perform some sanity checks on pointers */ 16111 /* perform some sanity checks on pointers */
16109 fprintf(fp, "forkshell %p %6d\n", new, (int)sizeof(*new)); 16112 fprintf(fp, "forkshell %p %6d\n", new, (int)sizeof(*new));
@@ -16116,7 +16119,7 @@ forkshell_prepare(struct forkshell *fs)
16116 16119
16117 forkshell_print(fp, new, annot); 16120 forkshell_print(fp, new, annot);
16118 16121
16119 for (i = 0; i < size; ++i) { 16122 for (i = 0; i < relocatesize; ++i) {
16120 if (relocate[i] == FREE) { 16123 if (relocate[i] == FREE) {
16121 free((void *)annot[i]); 16124 free((void *)annot[i]);
16122 } 16125 }
@@ -16165,7 +16168,7 @@ forkshell_init(const char *idstr)
16165 16168
16166 /* pointer fixup */ 16169 /* pointer fixup */
16167 lrelocate = (char *)fs + fs->size; 16170 lrelocate = (char *)fs + fs->size;
16168 for (i = 0; i < fs->size; i++) { 16171 for (i = 0; i < fs->relocatesize; i++) {
16169 if (lrelocate[i]) { 16172 if (lrelocate[i]) {
16170 ptr = (char **)((char *)fs + i); 16173 ptr = (char **)((char *)fs + i);
16171 if (*ptr) 16174 if (*ptr)