[openfirmware] r1648 - ofw/fs/ext2fs

svn at openfirmware.info svn at openfirmware.info
Thu Jan 7 22:12:26 CET 2010


Author: wmb
Date: 2010-01-07 22:12:26 +0100 (Thu, 07 Jan 2010)
New Revision: 1648

Modified:
   ofw/fs/ext2fs/methods.fth
Log:
OLPC trac 9957 - prevent duplicate names when using $rename or hardlink on ext2 file systems.


Modified: ofw/fs/ext2fs/methods.fth
===================================================================
--- ofw/fs/ext2fs/methods.fth	2010-01-07 08:04:00 UTC (rev 1647)
+++ ofw/fs/ext2fs/methods.fth	2010-01-07 21:12:26 UTC (rev 1648)
@@ -39,11 +39,16 @@
 : $delete!  $delete ;			\ XXX should these be different?
 
 : $hardlink  ( old-name$ new-name$ -- error? )
+   \ Error if the new name already exists
+   2dup $find-file  0=  if                        ( old-name$ new-name$ )
+      4drop true exit                             ( -- true )
+   then                                           ( old-name$ new-name$ )
+
    \ Save the current search context.  The path part of the new name
    \ has already been parsed out and resolved.  Resolving old-name$ changes
    \ the directory context, so we will need to restore the context for the
    \ new name to create its dirent.
-   dirent-vars 2>r 2>r                            ( new-name$ r: 4xVars )
+   dirent-vars 2>r 2>r                            ( old-name$ new-name$ r: 4xVars )
 
    2swap $find-file  if                           ( new-name$ r: 4xVars )
       2drop  2r> 2r> 4drop  true  exit
@@ -51,7 +56,7 @@
 
    \ Hard links to directories mess up the filesystem tree
    wf-type dir-type =  if  2drop true exit  then  ( new-name$ r: 4xVars)
-   
+
    2r> 2r> restore-dirent	                  ( new-name$ )
    wf-inum  new-dirent                            ( error? )
 ;
@@ -105,7 +110,7 @@
    dirent-unlink                                ( r: dir-i# )
 
    r> drop                                      ( )
-   
+
    false
 ;
 
@@ -134,7 +139,7 @@
 ;
 
 : ext2fsfread   ( addr count 'fh -- #read )
-   drop 
+   drop
    dup bsize > abort" Bad size for ext2fsfread"
    file-size  lblk# bsize *  -	( addr count rem )
    umin swap			( actual addr )
@@ -143,7 +148,7 @@
 ;
 
 : ext2fsfwrite   ( addr count 'fh -- #written )
-   drop 
+   drop
    dup bsize > abort" Bad size for ext2fsfwrite"	( addr count )
    tuck  lblk# bsize * + dup file-size u>  if		( actual addr new )
       file-size!				\ changing byte count, NOT #blks
@@ -151,7 +156,7 @@
       drop
    then							( actual addr )
    lblk# write-file-block				( actual )
-   
+
    \ XXX I am skeptical about this line.
    dup  0>  if  lblk#++  then				( actual )
    true to modified?
@@ -164,7 +169,7 @@
 
    dirent-inode@ set-inode                              ( mode )
    false to modified?
-   
+
    >r
    bsize alloc-mem bsize initbuf
    dirent-inode@  r@  ['] ext2fsdflen ['] ext2fsdfalign ['] ext2fsfclose ['] ext2fsdfseek 




More information about the openfirmware mailing list