2015-12-13 18:29:49 (UTC-02:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Do not dereference symlinks when copying.
diff --git a/rover.c b/rover.c index 3c5838a..64e06b1 100644 --- a/rover.c +++ b/rover.c @@ -786,22 +786,30 @@ static int cpyfile(const char *srcpath) { char buf[BUFSIZ]; char dstpath[PATH_MAX]; - ret = src = open(srcpath, O_RDONLY); - if (ret < 0) return ret; - ret = fstat(src, &st); - if (ret < 0) return ret; strcpy(dstpath, CWD); strcat(dstpath, srcpath + strlen(rover.marks.dirpath)); - ret = dst = creat(dstpath, st.st_mode); + ret = lstat(srcpath, &st); if (ret < 0) return ret; - while ((size = read(src, buf, BUFSIZ)) > 0) { - write(dst, buf, size); - update_progress(size); - sync_signals(); + if (S_ISLNK(st.st_mode)) { + ret = readlink(srcpath, BUF1, BUFLEN); + if (ret < 0) return ret; + BUF1[ret] = '\0'; + ret = symlink(BUF1, dstpath); + } else { + ret = src = open(srcpath, O_RDONLY); + if (ret < 0) return ret; + ret = dst = creat(dstpath, st.st_mode); + if (ret < 0) return ret; + while ((size = read(src, buf, BUFSIZ)) > 0) { + write(dst, buf, size); + update_progress(size); + sync_signals(); + } + close(src); + close(dst); + ret = 0; } - close(src); - close(dst); - return 0; + return ret; } static int adddir(const char *path) { int ret;