File name too long

Paul Slootman paul at debian.org
Tue Mar 11 20:47:10 EST 2003


On Tue 11 Mar 2003, jw schultz wrote:
> 
> That or char fscratch[MAXPATHLEN];
> Just don't use malloc.

How about this:


static int get_tmpname(char *fnametmp, char *fname)
{
	char	*f;
	char	*dir = "";	/* what dir to put the temp file in */
	char	namepart[NAME_MAX-10];	/* we never need more than this, if   */
					/* the name is longer, we would end   */
					/* up having to shorten it anyway     */
	if (tmpdir)
		dir = tmpdir;

	f = strrchr(fname,'/');	/* is there a directory to skip in fname? */
	if (f == NULL) {		/* no */
		/* the strlcpy takes care of making the name short enough */
		/* and null-terminating it at the same time. */
		strlcpy(namepart, fname, sizeof(namepart));
	}
	else {				/* yes */
		strlcpy(namepart, f+1, sizeof(namepart));
	}

	if (strlen(dir)+strlen(namepart)+1 > MAXPATHLEN) {
		/* how often will this happen... the temp dir would have to */
		/* a very long name, and hence the fault of the user who    */
		/* specified it. Let him fix the problem.                   */
		rprintf(FERROR,"filename too long\n");
		return 0;
	}

	/* construct temp name template */
	snprintf(fnametmp, MAXPATHLEN, "%s%s.%s.XXXXXX",
                                        dir, dir[0]?"/":"", namepart);

	return 1;
}


Even shorter than it was, it should now be difficult to mess this up :-)
I thought of letting the default value of dir be "./", but then
clean_fname would end up shifting that off again, thus wasting
resources.


Paul Slootman


More information about the rsync mailing list