aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-11-14 21:59:22 +0000
committerEric Andersen <andersen@codepoet.org>2000-11-14 21:59:22 +0000
commit46f0beb16723acec0f03859ba813209e96396901 (patch)
tree60440e241f5a393651914e5006857fd23bceda0f
parent2aa1091130d86465534ab51adb42a0f33a40958b (diff)
downloadbusybox-w32-46f0beb16723acec0f03859ba813209e96396901.tar.gz
busybox-w32-46f0beb16723acec0f03859ba813209e96396901.tar.bz2
busybox-w32-46f0beb16723acec0f03859ba813209e96396901.zip
Patch from Gennady Feldman <gfeldman@tradeline.net> to:
1. Opens redirections w/ the right access. 2. Doesn't do globbing for every single parameter (so it doesn't stat every parameter).
-rw-r--r--lash.c57
-rw-r--r--sh.c57
-rw-r--r--shell/lash.c57
3 files changed, 102 insertions, 69 deletions
diff --git a/lash.c b/lash.c
index b10614259..7a8810aef 100644
--- a/lash.c
+++ b/lash.c
@@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog)
627 mode = O_RDONLY; 627 mode = O_RDONLY;
628 break; 628 break;
629 case REDIRECT_OVERWRITE: 629 case REDIRECT_OVERWRITE:
630 mode = O_RDWR | O_CREAT | O_TRUNC; 630 mode = O_WRONLY | O_CREAT | O_TRUNC;
631 break; 631 break;
632 case REDIRECT_APPEND: 632 case REDIRECT_APPEND:
633 mode = O_RDWR | O_CREAT | O_APPEND; 633 mode = O_WRONLY | O_CREAT | O_APPEND;
634 break; 634 break;
635 } 635 }
636 636
@@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr,
785#endif 785#endif
786 } 786 }
787 787
788 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); 788 if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){
789 if (rc == GLOB_NOSPACE) { 789 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult);
790 errorMsg("out of space during glob operation\n"); 790 if (rc == GLOB_NOSPACE) {
791 return; 791 errorMsg("out of space during glob operation\n");
792 } else if (rc == GLOB_NOMATCH || 792 return;
793 } else if (rc == GLOB_NOMATCH ||
793 (!rc && (prog->globResult.gl_pathc - i) == 1 && 794 (!rc && (prog->globResult.gl_pathc - i) == 1 &&
794 strcmp(prog->argv[argc_l - 1], 795 strcmp(prog->argv[argc_l - 1],
795 prog->globResult.gl_pathv[i]) == 0)) { 796 prog->globResult.gl_pathv[i]) == 0)) {
796 /* we need to remove whatever \ quoting is still present */ 797 /* we need to remove whatever \ quoting is still present */
797 src = dst = prog->argv[argc_l - 1]; 798 src = dst = prog->argv[argc_l - 1];
798 while (*src) { 799 while (*src) {
799 if (*src != '\\') 800 if (*src != '\\')
800 *dst++ = *src; 801 *dst++ = *src;
801 src++; 802 src++;
803 }
804 *dst = '\0';
805 } else if (!rc) {
806 argcAlloced += (prog->globResult.gl_pathc - i);
807 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv));
808 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i,
809 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i));
810 argc_l += (prog->globResult.gl_pathc - i - 1);
802 } 811 }
803 *dst = '\0'; 812 }else{
804 } else if (!rc) { 813 src = dst = prog->argv[argc_l - 1];
805 argcAlloced += (prog->globResult.gl_pathc - i); 814 while (*src) {
806 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); 815 if (*src != '\\')
807 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, 816 *dst++ = *src;
808 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); 817 src++;
809 argc_l += (prog->globResult.gl_pathc - i - 1); 818 }
819 *dst = '\0';
820 prog->globResult.gl_pathc=0;
821 if (flags==0)
822 prog->globResult.gl_pathv=NULL;
810 } 823 }
811
812 *argcAllocedPtr = argcAlloced; 824 *argcAllocedPtr = argcAlloced;
813 *argcPtr = argc_l; 825 *argcPtr = argc_l;
814} 826}
@@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi
1128 } 1140 }
1129 1141
1130 *commandPtr = returnCommand; 1142 *commandPtr = returnCommand;
1131 1143
1132 return 0; 1144 return 0;
1133} 1145}
1134 1146
@@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
1143 const struct BB_applet *a = applets; 1155 const struct BB_applet *a = applets;
1144#endif 1156#endif
1145 1157
1146
1147 nextin = 0, nextout = 1; 1158 nextin = 0, nextout = 1;
1148 for (i = 0; i < newJob->numProgs; i++) { 1159 for (i = 0; i < newJob->numProgs; i++) {
1149 if ((i + 1) < newJob->numProgs) { 1160 if ((i + 1) < newJob->numProgs) {
diff --git a/sh.c b/sh.c
index b10614259..7a8810aef 100644
--- a/sh.c
+++ b/sh.c
@@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog)
627 mode = O_RDONLY; 627 mode = O_RDONLY;
628 break; 628 break;
629 case REDIRECT_OVERWRITE: 629 case REDIRECT_OVERWRITE:
630 mode = O_RDWR | O_CREAT | O_TRUNC; 630 mode = O_WRONLY | O_CREAT | O_TRUNC;
631 break; 631 break;
632 case REDIRECT_APPEND: 632 case REDIRECT_APPEND:
633 mode = O_RDWR | O_CREAT | O_APPEND; 633 mode = O_WRONLY | O_CREAT | O_APPEND;
634 break; 634 break;
635 } 635 }
636 636
@@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr,
785#endif 785#endif
786 } 786 }
787 787
788 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); 788 if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){
789 if (rc == GLOB_NOSPACE) { 789 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult);
790 errorMsg("out of space during glob operation\n"); 790 if (rc == GLOB_NOSPACE) {
791 return; 791 errorMsg("out of space during glob operation\n");
792 } else if (rc == GLOB_NOMATCH || 792 return;
793 } else if (rc == GLOB_NOMATCH ||
793 (!rc && (prog->globResult.gl_pathc - i) == 1 && 794 (!rc && (prog->globResult.gl_pathc - i) == 1 &&
794 strcmp(prog->argv[argc_l - 1], 795 strcmp(prog->argv[argc_l - 1],
795 prog->globResult.gl_pathv[i]) == 0)) { 796 prog->globResult.gl_pathv[i]) == 0)) {
796 /* we need to remove whatever \ quoting is still present */ 797 /* we need to remove whatever \ quoting is still present */
797 src = dst = prog->argv[argc_l - 1]; 798 src = dst = prog->argv[argc_l - 1];
798 while (*src) { 799 while (*src) {
799 if (*src != '\\') 800 if (*src != '\\')
800 *dst++ = *src; 801 *dst++ = *src;
801 src++; 802 src++;
803 }
804 *dst = '\0';
805 } else if (!rc) {
806 argcAlloced += (prog->globResult.gl_pathc - i);
807 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv));
808 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i,
809 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i));
810 argc_l += (prog->globResult.gl_pathc - i - 1);
802 } 811 }
803 *dst = '\0'; 812 }else{
804 } else if (!rc) { 813 src = dst = prog->argv[argc_l - 1];
805 argcAlloced += (prog->globResult.gl_pathc - i); 814 while (*src) {
806 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); 815 if (*src != '\\')
807 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, 816 *dst++ = *src;
808 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); 817 src++;
809 argc_l += (prog->globResult.gl_pathc - i - 1); 818 }
819 *dst = '\0';
820 prog->globResult.gl_pathc=0;
821 if (flags==0)
822 prog->globResult.gl_pathv=NULL;
810 } 823 }
811
812 *argcAllocedPtr = argcAlloced; 824 *argcAllocedPtr = argcAlloced;
813 *argcPtr = argc_l; 825 *argcPtr = argc_l;
814} 826}
@@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi
1128 } 1140 }
1129 1141
1130 *commandPtr = returnCommand; 1142 *commandPtr = returnCommand;
1131 1143
1132 return 0; 1144 return 0;
1133} 1145}
1134 1146
@@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
1143 const struct BB_applet *a = applets; 1155 const struct BB_applet *a = applets;
1144#endif 1156#endif
1145 1157
1146
1147 nextin = 0, nextout = 1; 1158 nextin = 0, nextout = 1;
1148 for (i = 0; i < newJob->numProgs; i++) { 1159 for (i = 0; i < newJob->numProgs; i++) {
1149 if ((i + 1) < newJob->numProgs) { 1160 if ((i + 1) < newJob->numProgs) {
diff --git a/shell/lash.c b/shell/lash.c
index b10614259..7a8810aef 100644
--- a/shell/lash.c
+++ b/shell/lash.c
@@ -627,10 +627,10 @@ static int setupRedirections(struct childProgram *prog)
627 mode = O_RDONLY; 627 mode = O_RDONLY;
628 break; 628 break;
629 case REDIRECT_OVERWRITE: 629 case REDIRECT_OVERWRITE:
630 mode = O_RDWR | O_CREAT | O_TRUNC; 630 mode = O_WRONLY | O_CREAT | O_TRUNC;
631 break; 631 break;
632 case REDIRECT_APPEND: 632 case REDIRECT_APPEND:
633 mode = O_RDWR | O_CREAT | O_APPEND; 633 mode = O_WRONLY | O_CREAT | O_APPEND;
634 break; 634 break;
635 } 635 }
636 636
@@ -785,30 +785,42 @@ static void globLastArgument(struct childProgram *prog, int *argcPtr,
785#endif 785#endif
786 } 786 }
787 787
788 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult); 788 if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){
789 if (rc == GLOB_NOSPACE) { 789 rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult);
790 errorMsg("out of space during glob operation\n"); 790 if (rc == GLOB_NOSPACE) {
791 return; 791 errorMsg("out of space during glob operation\n");
792 } else if (rc == GLOB_NOMATCH || 792 return;
793 } else if (rc == GLOB_NOMATCH ||
793 (!rc && (prog->globResult.gl_pathc - i) == 1 && 794 (!rc && (prog->globResult.gl_pathc - i) == 1 &&
794 strcmp(prog->argv[argc_l - 1], 795 strcmp(prog->argv[argc_l - 1],
795 prog->globResult.gl_pathv[i]) == 0)) { 796 prog->globResult.gl_pathv[i]) == 0)) {
796 /* we need to remove whatever \ quoting is still present */ 797 /* we need to remove whatever \ quoting is still present */
797 src = dst = prog->argv[argc_l - 1]; 798 src = dst = prog->argv[argc_l - 1];
798 while (*src) { 799 while (*src) {
799 if (*src != '\\') 800 if (*src != '\\')
800 *dst++ = *src; 801 *dst++ = *src;
801 src++; 802 src++;
803 }
804 *dst = '\0';
805 } else if (!rc) {
806 argcAlloced += (prog->globResult.gl_pathc - i);
807 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv));
808 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i,
809 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i));
810 argc_l += (prog->globResult.gl_pathc - i - 1);
802 } 811 }
803 *dst = '\0'; 812 }else{
804 } else if (!rc) { 813 src = dst = prog->argv[argc_l - 1];
805 argcAlloced += (prog->globResult.gl_pathc - i); 814 while (*src) {
806 prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv)); 815 if (*src != '\\')
807 memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i, 816 *dst++ = *src;
808 sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i)); 817 src++;
809 argc_l += (prog->globResult.gl_pathc - i - 1); 818 }
819 *dst = '\0';
820 prog->globResult.gl_pathc=0;
821 if (flags==0)
822 prog->globResult.gl_pathv=NULL;
810 } 823 }
811
812 *argcAllocedPtr = argcAlloced; 824 *argcAllocedPtr = argcAlloced;
813 *argcPtr = argc_l; 825 *argcPtr = argc_l;
814} 826}
@@ -1128,7 +1140,7 @@ static int parseCommand(char **commandPtr, struct job *job, struct jobSet *jobLi
1128 } 1140 }
1129 1141
1130 *commandPtr = returnCommand; 1142 *commandPtr = returnCommand;
1131 1143
1132 return 0; 1144 return 0;
1133} 1145}
1134 1146
@@ -1143,7 +1155,6 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
1143 const struct BB_applet *a = applets; 1155 const struct BB_applet *a = applets;
1144#endif 1156#endif
1145 1157
1146
1147 nextin = 0, nextout = 1; 1158 nextin = 0, nextout = 1;
1148 for (i = 0; i < newJob->numProgs; i++) { 1159 for (i = 0; i < newJob->numProgs; i++) {
1149 if ((i + 1) < newJob->numProgs) { 1160 if ((i + 1) < newJob->numProgs) {