Changeset 112608


Ignore:
Timestamp:
Oct 28, 2013, 12:09:16 AM (5 years ago)
Author:
cal@…
Message:

darwintrace: avoid unnecessary strcpy(3) in the default cause of darwintrace_log_op, avoid cleanup on already normalized path

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/darwintracelib1.0/darwintrace.c

    r112607 r112608  
    118118static inline char *const *__darwintrace_restore_env(char *const envp[]);
    119119static inline void __darwintrace_setup();
    120 static inline void __darwintrace_cleanup_path(char *path);
    121120static char *__send(const char *buf, uint32_t len, int answer);
    122121
     
    626625static inline void __darwintrace_log_op(const char *op, const char *path, int fd) {
    627626        uint32_t size;
    628         char somepath[MAXPATHLEN];
     627        char pathbuf[MAXPATHLEN];
    629628        char logbuffer[BUFFER_SIZE];
     629        const char *realpath;
    630630
    631631        do {
    632632#       ifdef __APPLE__ /* Only Darwin has volfs and F_GETPATH */
    633633                if ((fd > 0) && (strncmp(path, "/.vol/", 6) == 0)) {
    634                         if (fcntl(fd, F_GETPATH, somepath) != -1) {
     634                        if (fcntl(fd, F_GETPATH, pathbuf) != -1) {
     635                                realpath = pathbuf;
    635636                                break;
    636637                        }
     
    639640
    640641                if (*path != '/') {
    641                         if (!getcwd(somepath, sizeof(somepath))) {
     642                        if (!getcwd(pathbuf, sizeof(pathbuf))) {
    642643                                perror("darwintrace: getcwd");
    643644                                abort();
    644645                        }
    645646
    646                         strlcat(somepath, "/", sizeof(somepath));
    647                         strlcat(somepath, path, sizeof(somepath));
     647                        strlcat(pathbuf, "/", sizeof(pathbuf));
     648                        strlcat(pathbuf, path, sizeof(pathbuf));
     649                        realpath = pathbuf;
    648650                        break;
    649651                }
    650652
    651653                /* otherwise, just copy the original path. */
    652                 strlcpy(somepath, path, sizeof(somepath));
     654                realpath = path;
    653655        } while (0);
    654656
    655         /* clean the path. */
    656         __darwintrace_cleanup_path(somepath);
    657 
    658         size = snprintf(logbuffer, sizeof(logbuffer), "%s\t%s", op, somepath);
     657        size = snprintf(logbuffer, sizeof(logbuffer), "%s\t%s", op, realpath);
    659658        __send(logbuffer, size, 0);
    660 }
    661 
    662 /**
    663  * remap resource fork access to the data fork.
    664  * do a partial realpath(3) to fix "foo//bar" to "foo/bar"
    665  */
    666 static inline void __darwintrace_cleanup_path(char *path) {
    667         size_t pathlen;
    668 #   ifdef __APPLE__
    669         size_t rsrclen;
    670 #   endif
    671         char *dst, *src;
    672         enum { SAWSLASH, NOTHING } state = NOTHING;
    673 
    674         /* if this is a foo/..namedfork/rsrc, strip it off */
    675         pathlen = strlen(path);
    676         /* ..namedfork/rsrc is only on OS X */
    677 #   ifdef __APPLE__
    678         rsrclen = strlen(_PATH_RSRCFORKSPEC);
    679         if (pathlen > rsrclen && 0 == strcmp(path + pathlen - rsrclen, _PATH_RSRCFORKSPEC)) {
    680                 path[pathlen - rsrclen] = '\0';
    681                 pathlen -= rsrclen;
    682         }
    683 #   endif
    684 
    685         /* for each position in string, check if we're in a run of multiple
    686          * slashes, and only emit the first one */
    687         for (src = path, dst = path; *src; src++) {
    688                 if (state == SAWSLASH) {
    689                         if (*src == '/') {
    690                                 /* consume it */
    691                                 continue;
    692                         }
    693                         state = NOTHING;
    694                 } else {
    695                         if (*src == '/') {
    696                                 state = SAWSLASH;
    697                         }
    698                 }
    699                 if (dst != src) {
    700                         // if dst == src, avoid the copy operation
    701                         *dst = *src;
    702                 }
    703                 dst++;
    704         }
    705659}
    706660
Note: See TracChangeset for help on using the changeset viewer.