New submission from Steve Ward <plane...@gmail.com>: In this revision <http://hg.python.org/cpython/rev/b6da97930f63>, the possible characters that comprise a temporary file decreased. It was noted in this thread <http://mail.python.org/pipermail/python-dev/2010-November/105452.html>. The old character set had more than 24 times as many possibilities! [1]
According to POSIX, the possible characters from which temporary file names should be constructed is [A-Za-z0-9._-]. [2] The character set should be restored to [A-Za-z0-9_] at the least. A patch is attached. The practices of other platforms, libraries, and languages are listed below. [3-12] [1] Old character set: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ (26+26+10+1) ^ 6 62523502209 Current character set: abcdefghijklmnopqrstuvwxyz0123456789_ (26+10+1) ^ 6 2565726409 62523502209 / 2565726409 24.36873315474378000994 [2] POSIX <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_276> 3.276 Portable Filename Character Set The set of characters from which portable filenames are constructed. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 . _ - [3] int mkstemp(char *template); <http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkstemp.html> The string in template should look like a filename with six trailing 'X' s; mkstemp() replaces each 'X' with a character from the portable filename character set. [4] glibc <http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/posix/tempname.c;hb=HEAD> /* These are the characters used in temporary filenames. */ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; [5] gnulib <http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/tempname.c;hb=HEAD> /* These are the characters used in temporary file names. */ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; [6] freebsd libc <http://svnweb.freebsd.org/base/head/lib/libc/stdio/mktemp.c?view=markup> static const unsigned char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; [7] openbsd libc <http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/mktemp.c?rev=HEAD;content-type=text%2Fplain> #define TEMPCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" [8] netbsd libc <http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/lib/libc/stdio/gettemp.c?rev=HEAD&content-type=text/plain> (uses pid) [9] perl <http://perl5.git.perl.org/perl.git/blob/HEAD:/cpan/File-Temp/Temp.pm> my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 _ /); [10] php <http://svn.php.net/viewvc/php/php-src/trunk/main/php_open_temporary_file.c?view=markup> (if Windows, call GetTempFileName; else if havel mkstemp, call it; else call mktemp) [11] ruby <http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/tmpdir.rb?view=markup> (uses current date, pid, and a random number between 0 and 4294967296 represented in base 36 (lowercase)) [12] Windows <http://msdn.microsoft.com/en-us/library/aa364991.aspx> <path>\<pre><uuuu>.TMP Component Meaning <path> Path specified by the lpPathName parameter <pre> First three letters of the lpPrefixString string <uuuu> Hexadecimal value of uUnique Only the lower 16 bits of the uUnique parameter are used. This limits GetTempFileName to a maximum of 65,535 unique file names if the lpPathName and lpPrefixString parameters remain the same. ---------- components: Library (Lib) files: tempfile.py.diff keywords: patch messages: 135261 nosy: planet36 priority: normal severity: normal status: open title: possible characters in temporary file name is too few versions: Python 3.1, Python 3.2, Python 3.3, Python 3.4 Added file: http://bugs.python.org/file21906/tempfile.py.diff _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue12015> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com