public inbox for linux-ext4@vger.kernel.org
 help / color / mirror / Atom feed
  • * Re: [PATCH] vfs: introduce helper function to safely NUL-terminate symlinks
           [not found] ` <1229442720-31056-2-git-send-email-duaneg@dghda.com>
           [not found]   ` <1229442720-31056-3-git-send-email-duaneg@dghda.com>
    @ 2008-12-16 23:46   ` Andreas Dilger
      2008-12-17  0:26     ` Duane Griffin
      1 sibling, 1 reply; 7+ messages in thread
    From: Andreas Dilger @ 2008-12-16 23:46 UTC (permalink / raw)
      To: Duane Griffin
      Cc: linux-kernel, linux-fsdevel, Al Viro, Andrew Morton,
    	Theodore Ts'o, linux-ext4
    
    On Dec 16, 2008  15:51 +0000, Duane Griffin wrote:
    > A number of filesystems were potentially triggering kernel bugs due to
    > corrupted symlink names on disk. This helper helps safely terminate the
    > names.
    > 
    > +static inline void nd_terminate_link(void *name,unsigned len,unsigned maxlen)
    > +{
    > +	((char *) name)[min(len, maxlen)] = '\0';
    > +}
    
    > @@ -4200,9 +4201,11 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
    >  	} else if (S_ISLNK(inode->i_mode)) {
    > +		if (ext4_inode_is_fast_symlink(inode)) {
    >  			inode->i_op = &ext4_fast_symlink_inode_operations;
    > +			nd_terminate_link(ei->i_data, inode->i_size,
    > +				sizeof(ei->i_data));
    > +		} else {
    >  			inode->i_op = &ext4_symlink_inode_operations;
    >  			ext4_set_aops(inode);
    >  		}
    
    With sizeof(ei->i_data) = 15 * 4 = 60 bytes, this will set ei->i_data[60]
    as NUL, which is writing 1 byte beyond the end of the array.
    
    Note that in ext[234]_symlink() the check for fast symlinks is:
    
    	l = strlen(symname)+1;
            if (l > sizeof (EXT3_I(inode)->i_data)) {
    		inode->i_op = &ext3_symlink_inode_operations;
    	} else {
    		inode->i_op = &ext3_fast_symlink_inode_operations;
    		inode->i_size = l-1;
    	}
    
    so in fact the fast symlinks should always have space for a trailing NUL
    character, and "sizeof(ei->i_data) - 1" is the right maxlen to use for
    ext[234].
    
    That might not be true for other filesystems, in which case you would
    need to add a "padding" field after the symlink name in memory to hold
    the trailing NUL.
    
    Cheers, Andreas
    --
    Andreas Dilger
    Sr. Staff Engineer, Lustre Group
    Sun Microsystems of Canada, Inc.
    
    
    ^ permalink raw reply	[flat|nested] 7+ messages in thread

  • end of thread, other threads:[~2008-12-19 19:43 UTC | newest]
    
    Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <1229442720-31056-1-git-send-email-duaneg@dghda.com>
         [not found] ` <1229442720-31056-2-git-send-email-duaneg@dghda.com>
         [not found]   ` <1229442720-31056-3-git-send-email-duaneg@dghda.com>
         [not found]     ` <1229442720-31056-4-git-send-email-duaneg@dghda.com>
    2008-12-16 15:51       ` [PATCH] ext3: ensure fast symlinks are NUL-terminated Duane Griffin
    2008-12-16 15:51         ` [PATCH] ext4: " Duane Griffin
    2008-12-16 23:46   ` [PATCH] vfs: introduce helper function to safely NUL-terminate symlinks Andreas Dilger
    2008-12-17  0:26     ` Duane Griffin
    2008-12-19 15:03       ` Duane Griffin
    2008-12-19 19:28         ` Andrew Morton
    2008-12-19 19:43         ` Al Viro
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox