Apparently GNU mv is fond of extended attributes, and keeps breaking 9pfuse when I try to move a file between directories. This is the culprit:
src/cmd/9pfuse/fuse.c:175: case FUSE_SETXATTR: src/cmd/9pfuse/fuse.c:176: /* struct and two strings */ In fact, SETXATTR comes with one string (the name of the attribute), and one blob of arbitrary data (the length of which is given in the fuse_setxattr_in struct). So: src/cmd/9pfuse/fuse.c:179: || ((char*)m->tx)[m->hdr->len-1] != 0 the last byte of a well-formed message is not guaranteed to be NUL, and this check is not sensible. Suggested fix (which works locally): --- fuse.c 7 Nov 2007 22:31:22 -0000 1.11 +++ fuse.c 4 Jul 2008 04:57:15 -0000 @@ -173,10 +173,9 @@ goto bad; break; case FUSE_SETXATTR: - /* struct and two strings */ + /* struct, one string and one binary blob */ if(m->hdr->len <= sizeof(struct fuse_setxattr_in) - || ((char*)m->tx)[m->hdr->len-1] != 0 - || memchr((uchar*)m->tx+sizeof(struct fuse_setxattr_in), 0, m->hdr->len-sizeof(struct fuse_setxattr_in)-1) == 0) + || ((char*)m->tx)[m->hdr->len-1-((struct fuse_setxattr_in*)m->tx)->size] != 0) goto bad; break; Dropped the memchr as it is clearly satisfied by the previous condition. -sqweek