File name too long

Paul Slootman paul at debian.org
Wed Mar 12 01:45:05 EST 2003


On Tue 11 Mar 2003, jw schultz wrote:
> 
> Hmm.  I'm thinking we should just build fnametmp a piece at
> a time.  I coded it up to see how it would look.  Not as
> intuitive but there is a lot less strlen and no snprintf.
> It also deals shortens the filename both for MAXPATHLEN and
> for NAME_MAX so it is almost impossible for the function to
> fail or produce a pathname that breaks things.
...
> static int get_tmpname(char *fnametmp, char *fname)
> {
> 	char    *f;
> 	int     length = 0;
> 	int	maxname;
> 
> 
> 	if (tmpdir)
> 	{
> 		strlcpy(fnametmp, tmpdir, MAXPATHLEN - 2);
> 		length = strlen(fnametmp);
> 	}
> 
> 	if (f = strrchr(fname, '/')) {
> 		if (!tmpdir) {
> 			length = f - fname;
> 			strlcpy(fnametmp, fname, length);
> 		}
> 		++f;
> 	} else {
> 		f = fname;
> 	}
> 	strcpy(fnametmp + length, "/.");
> 	length += 2;

This will cause the tmpfile to end up in the root directory, if there is
no tmpdir and no directory in fname!  This is not good.
How about:

	if (length)
            fnametmp[length++] = '/';
	fnametmp[length++] = '.';

> 
> 	maxname = MIN(MAXPATHLEN - 8 - length, NAME_MAX - 9);

Shouldn't this be:

	maxname = MIN(MAXPATHLEN - 7 - length, NAME_MAX - 7);

because in both cases all we will be adding is ".XXXXXX" ?


Paul Slootman


More information about the rsync mailing list