Changeset 142289 for trunk/base


Ignore:
Timestamp:
Nov 9, 2015, 6:25:12 PM (4 years ago)
Author:
cal@…
Message:

base: pextlib/sip_copy_proc: unify whitespace

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/pextlib1.0/sip_copy_proc.c

    r141420 r142289  
    6060 */
    6161static void free_argv(char *argv[]) {
    62         char **arg = argv;
    63         while (arg && *arg) {
    64                 free(*arg);
    65                 *arg = NULL;
    66                 arg++;
    67         }
    68 
    69         free(argv);
     62    char **arg = argv;
     63    while (arg && *arg) {
     64        free(*arg);
     65        *arg = NULL;
     66        arg++;
     67    }
     68
     69    free(argv);
    7070}
    7171
     
    120120        char **outargv[], char *const environ[], struct stat *st) {
    121121#ifndef SF_RESTRICTED /* no system integrity protection */
    122         return copy_not_needed;
     122    return copy_not_needed;
    123123#else /* defined(SF_RESTRICTED) */
    124         // check whether DYLD_INSERT_LIBRARIES is set
    125         bool dyld_insert_libraries_present = false;
    126         char *const *env = environ;
    127         while (env && *env) {
    128                 if (strncmp("DYLD_INSERT_LIBRARIES=", *env, strlen("DYLD_INSERT_LIBRARIES=")) == 0) {
    129                         dyld_insert_libraries_present = true;
    130                         break;
    131                 }
    132                 env++;
    133         }
    134         // if we didn't find DYLD_INSERT_LIBRARIES, a copy isn't needed
    135         if (!dyld_insert_libraries_present) {
    136                 return copy_not_needed;
    137         }
    138 
    139         // open file to check for shebangs
    140         const char *realpath = path;
    141         size_t new_argc = 0;
    142         char **new_argv = NULL;
    143         FILE *f = fopen(path, "r");
    144         if (!f) {
    145                 // if opening fails we won't be able to copy anyway
    146                 return copy_not_needed;
    147         }
    148 
    149         /* no error checking for fgetc(3) here, because this isn't a shebang if an
    150         * error occurs */
    151         if (fgetc(f) == '#' && fgetc(f) == '!') {
    152                 /* This is an interpreted script. The interpreter's flags are what
    153                 * affects whether DYLD_* is stripped, so read the interpreter's path
    154                 * from the file to check that instead. Additionally, read any flags
    155                 * that may be passed to the interpreter, since we'll have to do the
    156                 * shebang expansion in user space if we move the interpreter. */
    157                 char *linep = NULL;
    158                 size_t linecapp = 0;
    159                 // read first line to get the interpreter and its arguments
    160                 if (getline(&linep, &linecapp, f) > 0) {
    161                         char *ctxt;
     124    // check whether DYLD_INSERT_LIBRARIES is set
     125    bool dyld_insert_libraries_present = false;
     126    char *const *env = environ;
     127    while (env && *env) {
     128        if (strncmp("DYLD_INSERT_LIBRARIES=", *env, strlen("DYLD_INSERT_LIBRARIES=")) == 0) {
     129            dyld_insert_libraries_present = true;
     130            break;
     131        }
     132        env++;
     133    }
     134    // if we didn't find DYLD_INSERT_LIBRARIES, a copy isn't needed
     135    if (!dyld_insert_libraries_present) {
     136        return copy_not_needed;
     137    }
     138
     139    // open file to check for shebangs
     140    const char *realpath = path;
     141    size_t new_argc = 0;
     142    char **new_argv = NULL;
     143    FILE *f = fopen(path, "r");
     144    if (!f) {
     145        // if opening fails we won't be able to copy anyway
     146        return copy_not_needed;
     147    }
     148
     149    /* no error checking for fgetc(3) here, because this isn't a shebang if an
     150    * error occurs */
     151    if (fgetc(f) == '#' && fgetc(f) == '!') {
     152        /* This is an interpreted script. The interpreter's flags are what
     153        * affects whether DYLD_* is stripped, so read the interpreter's path
     154        * from the file to check that instead. Additionally, read any flags
     155        * that may be passed to the interpreter, since we'll have to do the
     156        * shebang expansion in user space if we move the interpreter. */
     157        char *linep = NULL;
     158        size_t linecapp = 0;
     159        // read first line to get the interpreter and its arguments
     160        if (getline(&linep, &linecapp, f) > 0) {
     161            char *ctxt;
    162162            char *word;
    163163            size_t idx;
    164                         // do word splitting on the interpreter line and store it in new_argv
    165                         for (idx = 0, word = strtok_r(linep, " \t\n", &ctxt);
    166                                         word != NULL;
    167                                         idx++, word = strtok_r(NULL, " \t\n", &ctxt)) {
    168                                 // make sure we have enough space allocated
    169                                 if (new_argv == NULL) {
    170                                         if ((new_argv = malloc(2 * sizeof(*new_argv))) == NULL) {
     164            // do word splitting on the interpreter line and store it in new_argv
     165            for (idx = 0, word = strtok_r(linep, " \t\n", &ctxt);
     166                    word != NULL;
     167                    idx++, word = strtok_r(NULL, " \t\n", &ctxt)) {
     168                // make sure we have enough space allocated
     169                if (new_argv == NULL) {
     170                    if ((new_argv = malloc(2 * sizeof(*new_argv))) == NULL) {
    171171                        free(linep);
    172172                        return copy_needed_error;
    173                                         }
    174                                         new_argc = 1;
    175 
    176                                         // new_argv[0] will be overwritten in a second
    177                                         // new_argv[1] is the terminating NULL
    178                                         new_argv[0] = NULL;
    179                                         new_argv[1] = NULL;
    180                                 } else if (idx >= new_argc) {
    181                                         // realloc to increase the size
    182                                         char **oldargv = new_argv;
    183                                         if ((new_argv = realloc(oldargv, (idx + 2) * sizeof(*new_argv))) == NULL) {
    184                                                 free_argv(oldargv);
     173                    }
     174                    new_argc = 1;
     175
     176                    // new_argv[0] will be overwritten in a second
     177                    // new_argv[1] is the terminating NULL
     178                    new_argv[0] = NULL;
     179                    new_argv[1] = NULL;
     180                } else if (idx >= new_argc) {
     181                    // realloc to increase the size
     182                    char **oldargv = new_argv;
     183                    if ((new_argv = realloc(oldargv, (idx + 2) * sizeof(*new_argv))) == NULL) {
     184                        free_argv(oldargv);
    185185                        free(linep);
    186186                        return copy_needed_error;
    187                                         }
    188                                         new_argc = idx + 1;
    189                                 }
    190 
    191                                 // store a copy of the word in new_argv
    192                                 new_argv[idx] = strdup(word);
    193                                 if (!new_argv[idx]) {
    194                                         free_argv(new_argv);
     187                    }
     188                    new_argc = idx + 1;
     189                }
     190
     191                // store a copy of the word in new_argv
     192                new_argv[idx] = strdup(word);
     193                if (!new_argv[idx]) {
     194                    free_argv(new_argv);
    195195                    free(linep);
    196196                    return copy_needed_error;
    197                                 }
     197                }
    198198                new_argv[idx + 1] = NULL;
    199                         }
    200 
    201                         free(linep);
    202 
    203                         if (new_argv && *new_argv) {
    204                                 // interpreter found, check that instead of given path
    205                                 realpath = *new_argv;
    206                         }
    207                 }
    208         }
    209 
    210         // check whether the binary has SF_RESTRICTED and isn't SUID/SGID
    211         if (-1 == stat(realpath, st)) {
    212                 // on error, return and let execve(2) deal with it
    213                 free_argv(new_argv);
    214                 return copy_not_needed;
    215         } else {
    216                 if (!(st->st_flags & SF_RESTRICTED)) {
    217                         // no SIP on this binary
    218                         free_argv(new_argv);
    219                         return copy_not_needed;
    220                 }
    221                 if ((st->st_flags & (S_ISUID | S_ISGID)) > 0) {
    222                         // the binary is SUID/SGID, which would get lost when copying;
    223                         // DYLD_ variables are stripped for SUID/SGID binaries anyway
    224                         free_argv(new_argv);
    225                         return copy_not_needed;
    226                 }
    227         }
    228 
    229         // prefix the shebang line to the original argv
    230         if (new_argv != NULL) {
     199            }
     200
     201            free(linep);
     202
     203            if (new_argv && *new_argv) {
     204                // interpreter found, check that instead of given path
     205                realpath = *new_argv;
     206            }
     207        }
     208    }
     209
     210    // check whether the binary has SF_RESTRICTED and isn't SUID/SGID
     211    if (-1 == stat(realpath, st)) {
     212        // on error, return and let execve(2) deal with it
     213        free_argv(new_argv);
     214        return copy_not_needed;
     215    } else {
     216        if (!(st->st_flags & SF_RESTRICTED)) {
     217            // no SIP on this binary
     218            free_argv(new_argv);
     219            return copy_not_needed;
     220        }
     221        if ((st->st_flags & (S_ISUID | S_ISGID)) > 0) {
     222            // the binary is SUID/SGID, which would get lost when copying;
     223            // DYLD_ variables are stripped for SUID/SGID binaries anyway
     224            free_argv(new_argv);
     225            return copy_not_needed;
     226        }
     227    }
     228
     229    // prefix the shebang line to the original argv
     230    if (new_argv != NULL) {
    231231        size_t argc = 0;
    232232        for (char *const *argvwalk = argv; argvwalk && *argvwalk; ++argvwalk) {
     
    234234        }
    235235
    236                 // realloc to increase the size
    237                 char **oldargv = new_argv;
    238                 if ((new_argv = realloc(oldargv, (new_argc + argc + 1) * sizeof(*new_argv))) == NULL) {
    239                         free_argv(oldargv);
     236        // realloc to increase the size
     237        char **oldargv = new_argv;
     238        if ((new_argv = realloc(oldargv, (new_argc + argc + 1) * sizeof(*new_argv))) == NULL) {
     239            free_argv(oldargv);
    240240            return copy_needed_error;
    241                 }
    242 
    243                 new_argv[new_argc] = strdup(path);
    244                 if (!new_argv[new_argc]) {
     241        }
     242
     243        new_argv[new_argc] = strdup(path);
     244        if (!new_argv[new_argc]) {
    245245            free_argv(new_argv);
    246246            return copy_needed_error;
    247                 }
     247        }
    248248        new_argv[new_argc + 1] = NULL;
    249249
    250                 for (size_t idx = 1; idx < argc; ++idx) {
    251                         new_argv[new_argc + idx] = strdup(argv[idx]);
    252                         if (!new_argv[new_argc + idx]) {
     250        for (size_t idx = 1; idx < argc; ++idx) {
     251            new_argv[new_argc + idx] = strdup(argv[idx]);
     252            if (!new_argv[new_argc + idx]) {
    253253                free_argv(new_argv);
    254254                return copy_needed_error;
    255                         }
     255            }
    256256            new_argv[new_argc + idx + 1] = NULL;
    257                 }
    258 
    259                 new_argc = new_argc + argc;
    260 
    261                 *outargv = new_argv;
    262         }
    263 
    264         return copy_is_needed;
     257        }
     258
     259        new_argc = new_argc + argc;
     260
     261        *outargv = new_argv;
     262    }
     263
     264    return copy_is_needed;
    265265#endif /* defined(SF_RESTRICTED) */
    266266}
Note: See TracChangeset for help on using the changeset viewer.