File name too long

Luc Santeramo luc.santeramo at univ-avignon.fr
Wed Mar 12 01:35:28 EST 2003


Hi,

when I try to patch I got

# patch -p0 < file_name_too_long.diff
patching file rsync-2.5.6/receiver.c
Hunk #1 FAILED at 166.
1 out of 1 hunk FAILED -- saving rejects to file rsync-2.5.6/receiver.c.rej

am I doing something wrong?

thanks

Luc

>With this patch, I can successfully transfer a file that has a 255-char
>filename.
>
>Only thing that may be a problem is the NAME_MAX thing, but that's a
>POSIX thing, so should be relatively safe (famous last words).
>
>
>Paul Slootman
>
>diff -ru orig/rsync-2.5.6/receiver.c rsync-2.5.6/receiver.c
>--- orig/rsync-2.5.6/receiver.c 2003-01-21 00:32:17.000000000 +0100
>+++ rsync-2.5.6/receiver.c      2003-03-10 17:03:47.000000000 +0100
>@@ -166,37 +166,49 @@
>
>  static int get_tmpname(char *fnametmp, char *fname)
>  {
>-       char *f;
>-
>-       /* open tmp file */
>-       if (tmpdir) {
>-               f = strrchr(fname,'/');
>-               if (f == NULL)
>-                       f = fname;
>-               else
>-                       f++;
>-               if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
>-                       rprintf(FERROR,"filename too long\n");
>-                       return 0;
>-               }
>-               snprintf(fnametmp,MAXPATHLEN, "%s/.%s.XXXXXX",tmpdir,f);
>-               return 1;
>-       }
>-
>-       f = strrchr(fname,'/');
>+       char    *f;
>+       int     slash = 0;      /* restore the '/' ? */
>+       char    x = 0;          /* restore the shortened name (with this?) */
>+       char    *dir = "";      /* what dir to put the temp file in */
>+
>+       if (tmpdir)
>+               dir = tmpdir;
>+       f = strrchr(fname,'/'); /* is there a directory to skip in fname? */
>+       if (f == NULL) {
>+               f = fname;              /* no */
>+       }
>+       else {
>+               slash++;                /* yes */
>+               *f = 0;
>+               f++;
>+               dir = fname;
>+       }
>
>-       if (strlen(fname)+9 > MAXPATHLEN) {
>+       if (strlen(dir)+strlen(f)+1 > MAXPATHLEN) {
>                 rprintf(FERROR,"filename too long\n");
>                 return 0;
>         }
>
>-       if (f) {
>-               *f = 0;
>-               snprintf(fnametmp,MAXPATHLEN,"%s/.%s.XXXXXX",
>-                       fname,f+1);
>+       if (strlen(f)+8 > NAME_MAX || strlen(dir)+strlen(f)+9 > MAXPATHLEN) {
>+               /* temporarily shorten the name, it's just for a temp name 
>anyway */
>+               x = f[NAME_MAX-10];
>+               f[NAME_MAX-10] = 0;
>+       }
>+
>+       /* construct temp name template */
>+       if (*dir) {
>+               snprintf(fnametmp, MAXPATHLEN, "%s/.%s.XXXXXX", dir, f);
>+       }
>+       else {
>+               snprintf(fnametmp, MAXPATHLEN, ".%s.XXXXXX", f);
>+       }
>+
>+       if (x)
>+               f[NAME_MAX-10] = x; /* restore the name if necessary */
>+
>+       if (slash) {    /* restore slash if necessary */
>+               f--;
>                 *f = '/';
>-       } else {
>-               snprintf(fnametmp,MAXPATHLEN,".%s.XXXXXX",fname);
>         }
>
>         return 1;
>--
>To unsubscribe or change options: 
>http://lists.samba.org/mailman/listinfo/rsync
>Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html




More information about the rsync mailing list