From 85d9370c2f7cdcbe59c5cf7604d309116359a6b2 Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 13 Jul 2016 15:55:15 -0700 Subject: [PATCH] Clean up FollowSymlink --- src/libpsl-native/src/followsymlink.cpp | 150 ++++++++---------------- 1 file changed, 47 insertions(+), 103 deletions(-) diff --git a/src/libpsl-native/src/followsymlink.cpp b/src/libpsl-native/src/followsymlink.cpp index 6a77bcc52..46576256e 100644 --- a/src/libpsl-native/src/followsymlink.cpp +++ b/src/libpsl-native/src/followsymlink.cpp @@ -37,124 +37,68 @@ char* FollowSymLink(const char* fileName) { - errno = 0; + errno = 0; - // if filename is null, return null value if (!fileName) { errno = ERROR_INVALID_PARAMETER; return NULL; } - //if lstat in IsSymLink returns -1, path does not exist - if (IsSymLink(fileName) == -1) + // return null for non symlinks + if (!IsSymLink(fileName)) { return NULL; } - /*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/ - if (IsSymLink(fileName)) + // attempt to resolve with the absolute file path + char buffer[PATH_MAX]; + char* realPath = realpath(fileName, buffer); + + if (realPath) { - //Attempt to resolve with the absolute filepath - char actualpath[PATH_MAX+1]; - char* realPath = realpath(fileName, actualpath); - - //if realPath is null, go onto the readlink implementation - if (realPath == NULL) - { - char buffer[PATH_MAX]; - ssize_t sz = readlink(fileName, buffer, PATH_MAX); - - if (sz == -1) - { - switch(errno) - { - case EACCES: - errno = ERROR_ACCESS_DENIED; - break; - case EFAULT: - errno = ERROR_INVALID_ADDRESS; /*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/ - break; - case EINVAL: - errno = ERROR_INVALID_NAME; - case EIO: - errno = ERROR_GEN_FAILURE; - break; - case ELOOP: - errno = ERROR_STOPPED_ON_SYMLINK; - break; - case ENAMETOOLONG: - errno = ERROR_BAD_PATH_NAME; - break; - case ENOENT: - errno = ERROR_FILE_NOT_FOUND; - break; - case ENOMEM: - errno = ERROR_OUTOFMEMORY; - break; - case ENOTDIR: - errno = ERROR_BAD_PATH_NAME; - break; - default: - errno = ERROR_INVALID_FUNCTION; - } + return strndup(realPath, strlen(realPath) + 1); + } - return NULL; - } - - buffer[sz] = '\0'; - return strndup(buffer, sz + 1); - } - else + // if the path wasn't resolved, use readlink + ssize_t sz = readlink(fileName, buffer, PATH_MAX); + if (sz == -1) + { + switch(errno) { - return strndup(realPath, strlen(realPath) + 1 ); + case EACCES: + errno = ERROR_ACCESS_DENIED; + break; + case EFAULT: + errno = ERROR_INVALID_ADDRESS; + break; + case EINVAL: + errno = ERROR_INVALID_NAME; + case EIO: + errno = ERROR_GEN_FAILURE; + break; + case ELOOP: + errno = ERROR_STOPPED_ON_SYMLINK; + break; + case ENAMETOOLONG: + errno = ERROR_BAD_PATH_NAME; + break; + case ENOENT: + errno = ERROR_FILE_NOT_FOUND; + break; + case ENOMEM: + errno = ERROR_OUTOFMEMORY; + break; + case ENOTDIR: + errno = ERROR_BAD_PATH_NAME; + break; + default: + errno = ERROR_INVALID_FUNCTION; } + + return NULL; } - - else - { - char buffer[PATH_MAX]; - ssize_t sz = readlink(fileName, buffer, PATH_MAX); - - if (sz == -1) - { - switch(errno) - { - case EACCES: - errno = ERROR_ACCESS_DENIED; - break; - case EFAULT: - errno = ERROR_INVALID_ADDRESS; /*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/ - break; - case EINVAL: - errno = ERROR_INVALID_NAME; - case EIO: - errno = ERROR_GEN_FAILURE; - break; - case ELOOP: - errno = ERROR_STOPPED_ON_SYMLINK; - break; - case ENAMETOOLONG: - errno = ERROR_BAD_PATH_NAME; - break; - case ENOENT: - errno = ERROR_FILE_NOT_FOUND; - break; - case ENOMEM: - errno = ERROR_OUTOFMEMORY; - break; - case ENOTDIR: - errno = ERROR_BAD_PATH_NAME; - break; - default: - errno = ERROR_INVALID_FUNCTION; - } - return NULL; - } - - buffer[sz] = '\0'; - return strndup(buffer, sz + 1); - - } + buffer[sz] = '\0'; + return strndup(buffer, sz + 1); }