Author: llu Date: Tue Jul 26 23:15:32 2011 New Revision: 1151287 URL: http://svn.apache.org/viewvc?rev=1151287&view=rev Log: MAPREDUCE-2651. Fix race condition in Linux task controller for job log directory creation. (Bharath Mundlapudi via llu)
Modified: hadoop/common/branches/branch-0.20-security/CHANGES.txt hadoop/common/branches/branch-0.20-security/src/c++/task-controller/impl/task-controller.c Modified: hadoop/common/branches/branch-0.20-security/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/CHANGES.txt?rev=1151287&r1=1151286&r2=1151287&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.20-security/CHANGES.txt Tue Jul 26 23:15:32 2011 @@ -6,6 +6,9 @@ Release 0.20.205.0 - unreleased BUG FIXES + MAPREDUCE-2651. Fix race condition in Linux task controller for + job log directory creation. (Bharath Mundlapudi via llu) + HADOOP-6833. IPC leaks call parameters when exceptions thrown. (Todd Lipcon via Eli Collins) Modified: hadoop/common/branches/branch-0.20-security/src/c++/task-controller/impl/task-controller.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/c%2B%2B/task-controller/impl/task-controller.c?rev=1151287&r1=1151286&r2=1151287&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20-security/src/c++/task-controller/impl/task-controller.c (original) +++ hadoop/common/branches/branch-0.20-security/src/c++/task-controller/impl/task-controller.c Tue Jul 26 23:15:32 2011 @@ -620,9 +620,16 @@ int create_directory_for_user(const char uid_t user = geteuid(); gid_t group = getegid(); int ret = 0; - ret = change_effective_user(tt_uid, tt_gid); + uid_t root = 0; + + //This check is particularly required for c-based unit tests since + //tests run as a regular user. + if (getuid() == root) { + ret = change_effective_user(root, tt_gid); + } + if (ret == 0) { - if (mkdir(path, permissions) == 0) { + if (mkdir(path, permissions) == 0 || errno == EEXIST) { // need to reassert the group sticky bit if (chmod(path, permissions) != 0) { fprintf(LOGFILE, "Can't chmod %s to add the sticky bit - %s\n", @@ -631,21 +638,6 @@ int create_directory_for_user(const char } else if (change_owner(path, user, tt_gid) != 0) { ret = -1; } - } else if (errno == EEXIST) { - struct stat file_stat; - if (stat(path, &file_stat) != 0) { - fprintf(LOGFILE, "Can't stat directory %s - %s\n", path, - strerror(errno)); - ret = -1; - } else { - if (file_stat.st_uid != user || - file_stat.st_gid != tt_gid) { - fprintf(LOGFILE, "Directory %s owned by wrong user or group. " - "Expected %d:%d and found %d:%d.\n", - path, user, tt_gid, file_stat.st_uid, file_stat.st_gid); - ret = -1; - } - } } else { fprintf(LOGFILE, "Failed to create directory %s - %s\n", path, strerror(errno));