Bug #67220 [Com]: realpath() on MacOSX doesn't normalize the case of characters

From: Date: Fri, 01 Aug 2014 10:41:23 +0000
Subject: Bug #67220 [Com]: realpath() on MacOSX doesn't normalize the case of characters
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-186926@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=67220&edit=1 ID: 67220 Comment by: rullaf at gmail dot com Reported by: nicolas dot grekas+php at gmail dot com Summary: realpath() on MacOSX doesn't normalize the case of characters Status: Not a bug Type: Bug Package: Filesystem function related Operating System: MacOSX/Darwin PHP Version: 5.5.12 Block user comment: N Private report: N New Comment: Please note this is sill an issue. Either the documentation should be changed to warn the realpath function does NOT return canonical path (it currently says realpath — Returns canonicalized absolute pathname) or the function should be fixed. Previous Comments: ------------------------------------------------------------------------ [2014-05-07 18:10:44] tyrael@php.net for the record HFS+ is optionally supports case sensitivity, but the current default is the case insensitive/preserve mode AFAIK. I don't have a windows box at hand at the moment, but I'm fairly sure that realpath on windows does indeed correctly canonizes the path (http://www.php.net/realpath#example-2512 seems to be confirming this). I think closing the issue with Not a bug is wrong, we should either keep it open until we can fix it, or mark as Won't fix, and document it. ------------------------------------------------------------------------ [2014-05-07 15:14:41] nicolas dot grekas+php at gmail dot com The doc says "returns the canonicalized absolute pathname" "canonicalized" is what makes this a bug. An other example that fails is require_once: require_once 'TEST.PHP'; require_once 'test.php'; This does require the same file twice. ------------------------------------------------------------------------ [2014-05-07 15:06:58] rasmus@php.net Well, I am still somewhat sympathetic to this though. The native OSX realpath() call does normalize the case. eg. #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { printf("%s %s\n",realpath("/Users",NULL),realpath("/users",NULL)); return(0); } Outputs: /Users /Users And we used to do so as well when we relied on the system-level realpath() call. However, after we optimized realpath() to allow us to do intra-path caching, we now use our own implementation. Fixing this particular issue isn't that easy, and you are right, we don't promise to do path normalization in this function. ------------------------------------------------------------------------ [2014-05-07 14:58:50] levim@php.net Almost certainly this is because HFS+ is case-sensitive by default. Currently realpath "expands all symbolic links and resolves references to '/./', '/../' and extra '/' characters in the input path and returns the canonicalized absolute pathname". Nowhere does that indicate anything about case sensitivity. ------------------------------------------------------------------------ [2014-05-06 15:24:24] nicolas dot grekas+php at gmail dot com Description: ------------ See test script. __FILE__, __DIR__, ReflectionClass::getFilename(), etc. are also affected (but getcwd() is OK). Test script: --------------- <?php var_dump(realpath('/Users') === realpath('/users')); Expected result: ---------------- bool(true) Actual result: -------------- bool(false) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=67220&edit=1

« previous php.bugs (#186926) next »