On Tue, Sep 04, 2012 at 02:56:40PM +0200, MERIGHI Marcus wrote:
> with the diff below my ``panic: smashed stack in msdosfs_rename''
> problem does not appear any more. 
> 
> Index: msdosfs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v
> retrieving revision 1.82
> diff -u -r1.82 msdosfs_vnops.c
> --- msdosfs_vnops.c   11 Jul 2012 12:39:20 -0000      1.82
> +++ msdosfs_vnops.c   4 Sep 2012 09:28:32 -0000
> @@ -860,7 +860,7 @@
>       struct componentname *fcnp = ap->a_fcnp;
>       struct proc *p = curproc; /* XXX */
>       struct denode *ip, *xp, *dp, *zp;
> -     u_char toname[11], oldname[11];
> +     u_char toname[12], oldname[11];
>       uint32_t from_diroffset, to_diroffset;
>       u_char to_count;
>       int doingdirectory = 0, newparent = 0;
> 
> below is my lengthy report to bugs@ with some explanation.
> 
> Bye, Marcus

The problem seems to be rooted in a desire to printf() the dosname
in a debug statement. Otherwise the dos file names are not treated
as strings anywhere.

An alternate solution, that restores the symmetry between unix2dosfn()
and dos2unixfn(), is to use %.11s to print the dos file name in that
debug chunk, and otherwise consistantly treat the various dos file
names as 11-byte arrays.

Eliminiating one magic number (12) would seem a good thing. :-)

Comments about the non-stringiness of these vars might be good too.

.... Ken

Index: msdosfs_conv.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_conv.c,v
retrieving revision 1.14
diff -u -p -r1.14 msdosfs_conv.c
--- msdosfs_conv.c      13 Aug 2009 22:34:29 -0000      1.14
+++ msdosfs_conv.c      4 Sep 2012 13:45:37 -0000
@@ -403,7 +403,7 @@ dos2unixfn(u_char dn[11], u_char *un, in
  *     3 if conversion was successful and generation number was inserted
  */
 int
-unix2dosfn(u_char *un, u_char dn[12], int unlen, u_int gen)
+unix2dosfn(u_char *un, u_char dn[11], int unlen, u_int gen)
 {
        int i, j, l;
        int conv = 1;
@@ -416,7 +416,6 @@ unix2dosfn(u_char *un, u_char dn[12], in
         */
        for (i = 0; i < 11; i++)
                dn[i] = ' ';
-       dn[11] = 0;
        
        /*
         * The filenames "." and ".." are handled specially, since they
Index: msdosfs_lookup.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_lookup.c,v
retrieving revision 1.24
diff -u -p -r1.24 msdosfs_lookup.c
--- msdosfs_lookup.c    4 Jul 2011 04:30:41 -0000       1.24
+++ msdosfs_lookup.c    4 Sep 2012 13:38:29 -0000
@@ -104,7 +104,7 @@ msdosfs_lookup(void *v)
        struct msdosfsmount *pmp;
        struct buf *bp = 0;
        struct direntry *dep;
-       u_char dosfilename[12];
+       u_char dosfilename[11];
        u_char *adjp;
        int adjlen;
        int flags;
@@ -193,7 +193,7 @@ msdosfs_lookup(void *v)
                slotcount = 0;
        
 #ifdef MSDOSFS_DEBUG
-       printf("msdosfs_lookup(): dos version of filename %s, length %d\n",
+       printf("msdosfs_lookup(): dos version of filename '%.11s', length %d\n",
            dosfilename, cnp->cn_namelen);
 #endif
        /*

Reply via email to