Changeset 230

Show
Ignore:
Timestamp:
05/19/05 21:49:19 (4 years ago)
Author:
athomas
Message:
  • Fixed some array bounds checking bugs reported by Pierre Gentile.
  • Fixed some argument expansion issues.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • op/trunk/main.c

    r228 r230  
    866866                        strcpy(new_envp[curenv], "XAUTHORITY="); 
    867867                        strcat(new_envp[curenv], xauth); 
     868                        if (curenv + 1 >= MAXENV) 
     869                                fatal(1, "Environment length exceeded"); 
    868870                        ++curenv; 
    869871                        /* Propagate $DISPLAY to new environment */ 
     
    871873                        strcpy(new_envp[curenv], "DISPLAY="); 
    872874                        strcat(new_envp[curenv], getenv("DISPLAY")); 
     875                        if (curenv + 1 >= MAXENV) 
     876                                fatal(1, "Environment length exceeded"); 
    873877                        ++curenv; 
    874878                } 
     
    956960                                continue; 
    957961                        if (strchr(cmd->opts[i], '=') != NULL) { 
     962                                if (curenv + 1 >= MAXENV) 
     963                                        fatal(1, "Environment length exceeded"); 
    958964                                new_envp[curenv++] = cmd->opts[i] + 1; 
    959965                                continue; 
     
    964970                                if (strncmp(cmd->opts[i] + 1, environ[j], 
    965971                                                cp - environ[j]) == 0) { 
     972                                        if (curenv + 1 >= MAXENV) 
     973                                                fatal(1, "Environment length exceeded"); 
    966974                                        new_envp[curenv++] = environ[j]; 
    967975                                        break; 
     
    970978                } 
    971979        } else { 
    972                 for (i = 0; environ[i] != NULL; i++) 
     980                for (i = 0; environ[i] != NULL; i++) { 
     981                        if (curenv + 1 >= MAXENV) 
     982                                fatal(1, "Environment length exceeded"); 
    973983                        new_envp[curenv++] = environ[i]; 
     984                } 
    974985        } 
    975986        new_envp[curenv] = NULL; 
     
    980991                                break; 
    981992 
    982                 if (environ[i] != NULL) 
     993                if (environ[i] != NULL) { 
     994                        if (curarg >= MAXARG - 1) 
     995                                fatal(1, "Argument length exceeded"); 
    983996                        new_argv[curarg++] = environ[i] + 6; 
    984                 else { 
     997                } else { 
    985998                        fatal(1, "No shell"); 
    986999                } 
    9871000 
    9881001                if (argc != 1) { 
     1002                        if (curarg >= MAXARG - 1) 
     1003                                fatal(1, "Argument length exceeded"); 
    9891004                        new_argv[curarg++] = "-c"; 
    9901005 
     
    10021017                                strcat(cp, " "); 
    10031018                        } 
     1019                        if (curarg >= MAXARG - 1) 
     1020                                fatal(1, "Argument length exceeded"); 
    10041021                        new_argv[curarg++] = cp; 
    10051022                } 
     
    10081025                        np = cmd->args[i]; 
    10091026 
    1010                         /* Embedded match */ 
    1011                         while ((cp = strchr(np, '$')) != NULL) { 
    1012                                 if ((cp != cmd->args[i]) && (*(cp-1) == '\\')) 
    1013                                         np = cp + 1; 
    1014                                 else { 
    1015                                 char *tmp; 
    1016  
    1017                                         np = cp + 1; 
    1018                                         ++cp; 
    1019  
    1020                                         if (*cp == '*') { 
    1021                                         int len = 1; 
    1022                                         char *buffer; 
    1023  
     1027                        /* Complete argument is a variable expansion. */ 
     1028                        if (strlen(np) == 2 && np[0] == '$') { 
     1029                                if (np[1] == '*') { 
     1030                                        if (curarg + argc >= MAXARG - 1) 
     1031                                                fatal(1, "Argument length exceeded"); 
     1032                                        for (j = 1; j < argc; j++) 
     1033                                                new_argv[curarg++] = argv[j]; 
     1034                                } else 
     1035                                if (isdigit(np[1])) { 
     1036                                        if (atoi(np + 1) > argc) 
     1037                                                fatal(1, "Referenced argument out of range"); 
     1038                                        if (curarg >= MAXARG - 1) 
     1039                                                fatal(1, "Argument length exceeded"); 
     1040                                        new_argv[curarg++] = argv[atoi(np + 1)]; 
     1041                                } 
     1042                                continue; 
     1043                        } else { 
     1044                                /* Embedded match */ 
     1045                                while ((cp = strchr(np, '$')) != NULL) { 
     1046                                        if ((cp != cmd->args[i]) && (*(cp-1) == '\\')) 
     1047                                                np = cp + 1; 
     1048                                        else { 
     1049                                        char *tmp; 
     1050 
     1051                                                np = cp + 1; 
    10241052                                                ++cp; 
    1025                                                 /* Find total length of all arguments */ 
    1026                                                 for (j = 1; j < argc; j++) 
    1027                                                         len += strlen(argv[j]) + 1; 
    1028  
    1029                                                 if ((buffer = malloc(len)) == NULL) 
    1030                                                         fatal(1, "Can't allocate buffer"); 
    1031  
    1032                                                 buffer[0] = 0; 
    1033  
    1034                                                 /* Expand all arguments */ 
    1035                                                 for (j = 1; j < argc; j++) { 
    1036                                                         strcat(buffer, argv[j]); 
    1037                                                         if (j < argc - 1) strcat(buffer, " "); 
    1038                                                 } 
    1039                                                 tmp = str_replace(cmd->args[i], 
    1040                                                         np - cmd->args[i] - 1, cp - np + 1, buffer); 
    1041                                                 cp = tmp + (cp - cmd->args[i]); 
    1042                                                 np = cp; 
    1043                                                 cmd->args[i] = tmp; 
    1044                                         } else { 
    1045                                                 while (isdigit(*cp)) ++cp; 
    1046  
    1047                                                 if (cp != np) { 
    1048                                                         val = atoi(np); 
    1049  
     1053 
     1054                                                if (*cp == '*') { 
     1055                                                int len = 1; 
     1056                                                char *buffer; 
     1057 
     1058                                                        ++cp; 
     1059                                                        /* Find total length of all arguments */ 
     1060                                                        for (j = 1; j < argc; j++) 
     1061                                                                len += strlen(argv[j]) + 1; 
     1062 
     1063                                                        if ((buffer = malloc(len)) == NULL) 
     1064                                                                fatal(1, "Can't allocate buffer"); 
     1065 
     1066                                                        buffer[0] = 0; 
     1067 
     1068                                                        /* Expand all arguments */ 
     1069                                                        for (j = 1; j < argc; j++) { 
     1070                                                                strcat(buffer, argv[j]); 
     1071                                                                if (j < argc - 1) strcat(buffer, " "); 
     1072                                                        } 
    10501073                                                        tmp = str_replace(cmd->args[i], 
    1051                                                                 np - cmd->args[i] - 1, cp - np + 1, argv[val]); 
    1052                                                         cp = tmp + (cp - cmd->args[i]) + 1
     1074                                                                np - cmd->args[i] - 1, cp - np + 1, buffer); 
     1075                                                        cp = tmp + (cp - cmd->args[i])
    10531076                                                        np = cp; 
    10541077                                                        cmd->args[i] = tmp; 
     1078                                                } else { 
     1079                                                        while (isdigit(*cp)) ++cp; 
     1080 
     1081                                                        if (cp != np) { 
     1082                                                                val = atoi(np); 
     1083 
     1084                                                                tmp = str_replace(cmd->args[i], 
     1085                                                                        np - cmd->args[i] - 1, cp - np + 1, argv[val]); 
     1086                                                                cp = tmp + (cp - cmd->args[i]) + 1; 
     1087                                                                np = cp; 
     1088                                                                cmd->args[i] = tmp; 
     1089                                                        } 
    10551090                                                } 
    10561091                                        } 
     
    10591094 
    10601095                        if (cp == NULL) { 
     1096                                if (curarg >= MAXARG - 1) 
     1097                                        fatal(1, "Argument length exceeded"); 
    10611098                                new_argv[curarg++] = cmd->args[i]; 
    10621099                                continue;