PATH_MAX Includes Nul Fix
PATCH 1/1 PATH_MAX Includes Nul Fix
Linus, please apply.
Grepping for PATH_MAX in the kernel reveals some ambiguity in whether PATH_MAX includes a the trailing NUL or not. From Andrew Josey <[email protected]> (via Chris Yeoh):
POSIX has long had an ambiguity in the area about whether the null byte is included in the PATH_MAX (it basically said both ways in the 1990 text). The POSIX.1a draft (the amendment to POSIX.1-1990) and XPG4 went with including the null byte in PATH_MAX, and the POSIX 1003.1-200x revision (Austin Group) and Single UNIX Specification Version 3 also continue this way.
Note that to reach compliance, glibc will need to be adjusted as well.
include/linux/limits.h +1 -1
@@ -11,7 +11,7 @@#define MAX_CANON 255/* size of the canonical input queue */ #define MAX_INPUT 255/* size of the type-ahead buffer */ #define NAME_MAX 255/* # chars in a file name */ -#define PATH_MAX 4095/* # chars in a path name */ +#define PATH_MAX 4096/* # chars in a path name including nul */ #define PIPE_BUF 4096/* # bytes in atomic write to a pipe */ #define RTSIG_MAX 32
fs/dcache.c +1 -1
@@ -1262,7 +1262,7 @@panic ("Cannot create buffer head SLAB cache" ); names_cachep =kmem_cache_create ("names_cache" , -PATH_MAX +1 ,0 , +PATH_MAX ,0 ,SLAB_HWCACHE_ALIGN ,NULL ,NULL );if (!names_cachep)panic ("Cannot create names SLAB cache" );
fs/namei.c +3 -2
@@ -99,16 +99,17 @@* kernel data space before using them.. * * POSIX.1 2.4: an empty pathname is invalid (ENOENT). +* PATH_MAX includes the nul terminator --RR. */ static inline int do_getname (const char *filename,char *page) {int retval; -unsigned long len =PATH_MAX +1 ; +unsigned long len =PATH_MAX ;if ((unsigned long ) filename >=TASK_SIZE ) {if (!segment_eq (get_fs (),KERNEL_DS ))return -EFAULT ; - }else if (TASK_SIZE - (unsigned long ) filename <PATH_MAX +1 ) + }else if (TASK_SIZE - (unsigned long ) filename <PATH_MAX ) len =TASK_SIZE - (unsigned long ) filename; retval =strncpy_from_user ((char *)page, filename, len);
scripts/mkdep.c +1 -1
@@ -218,7 +218,7 @@void add_path (const char * name) {struct path_struct *path; -char resolved_path[PATH_MAX +1 ]; +char resolved_path[PATH_MAX ];const char *name2;if (strcmp (name,"." )) {
--
Premature optmztion is rt of all evl. --DK