[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    Re: ufs free()
From:       Christian Weisgerber <naddy () mips ! inka ! de>
Date:       2018-03-31 21:15:35
Message-ID: 20180331211535.GA51168 () lorvorc ! mips ! inka ! de
[Download RAW message or body]

David Hill:

> This diff adds sizes to free(), which completes ufs/ffs.

It's broken at least for softdep+UFS2.  This chunk blows up:

> --- ufs/ffs/ffs_softdep.c	10 Feb 2018 05:24:23 -0000	1.138
> +++ ufs/ffs/ffs_softdep.c	29 Mar 2018 02:55:37 -0000
> @@ -4034,7 +4036,8 @@ handle_written_inodeblock(struct inodede
>  			*dp1 = *inodedep->id_savedino1;
>  		else
>  			*dp2 = *inodedep->id_savedino2;
> -		free(inodedep->id_savedino1, M_INODEDEP, 0);
> +		free(inodedep->id_savedino1, M_INODEDEP,
> +		    sizeof(struct ufs1_dinode));
>  		inodedep->id_savedino1 = NULL;
>  		if ((bp->b_flags & B_DELWRI) == 0)
>  			stat_inode_bitmap++;

panic: free: size too small 128 <= 256 / 2 (0xffff80000099a700) type inodedep
Stopped at      db_enter+0x5:   popq    %rbp
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
db_enter() at db_enter+0x5
panic() at panic+0x129
free(ffffff07259d97c8,ffffff07259d97c8,ffffff071c6d4ef8) at free+0x35b
handle_written_inodeblock(ffffff07259d97c8,ffffff071c6d4e00) at handle_written_
inodeblock+0x1b5
softdep_disk_write_complete(ffffff071c6d4e00) at softdep_disk_write_complete+0x
255
biodone(ffffff071bd999e8) at biodone+0x73

id_savedino1 and id_savedino2 are a union, so it's pretty clear
that the free() needs to distinguish between the UFS1 and UFS2 cases
like the preceding lines do.

I don't know if check_inode_unwritten() needs to make the same
distinction:

> @@ -2307,7 +2307,8 @@ check_inode_unwritten(struct inodedep *i
>  	if (inodedep->id_state & ONWORKLIST)
>  		WORKLIST_REMOVE(&inodedep->id_list);
>  	if (inodedep->id_savedino1 != NULL) {
> -		free(inodedep->id_savedino1, M_INODEDEP, 0);
> +		free(inodedep->id_savedino1, M_INODEDEP,
> +		    sizeof(struct ufs1_dinode));
>  		inodedep->id_savedino1 = NULL;
>  	}
>  	if (free_inodedep(inodedep) == 0) {

-- 
Christian "naddy" Weisgerber                          naddy@mips.inka.de

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic