diff mbox series

[v4] ceph: avoid putting the realm twice when decoding snaps fails

Message ID 20221109030039.592830-1-xiubli@redhat.com (mailing list archive)
State New, archived
Headers show
Series [v4] ceph: avoid putting the realm twice when decoding snaps fails | expand

Commit Message

Xiubo Li Nov. 9, 2022, 3 a.m. UTC
From: Xiubo Li <xiubli@redhat.com>

When decoding the snaps fails it maybe leaving the 'first_realm'
and 'realm' pointing to the same snaprealm memory. And then it'll
put it twice and could cause random use-after-free, BUG_ON, etc
issues.

Cc: stable@vger.kernel.org
URL: https://tracker.ceph.com/issues/57686
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---

Changed in V4:
- remove initilizing of 'realm'.

 fs/ceph/snap.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Ilya Dryomov Nov. 9, 2022, 10:03 a.m. UTC | #1
On Wed, Nov 9, 2022 at 4:00 AM <xiubli@redhat.com> wrote:
>
> From: Xiubo Li <xiubli@redhat.com>
>
> When decoding the snaps fails it maybe leaving the 'first_realm'
> and 'realm' pointing to the same snaprealm memory. And then it'll
> put it twice and could cause random use-after-free, BUG_ON, etc
> issues.
>
> Cc: stable@vger.kernel.org
> URL: https://tracker.ceph.com/issues/57686
> Signed-off-by: Xiubo Li <xiubli@redhat.com>
> ---
>
> Changed in V4:
> - remove initilizing of 'realm'.
>
>  fs/ceph/snap.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
> index 9bceed2ebda3..c1c452afa84d 100644
> --- a/fs/ceph/snap.c
> +++ b/fs/ceph/snap.c
> @@ -764,7 +764,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
>         struct ceph_mds_snap_realm *ri;    /* encoded */
>         __le64 *snaps;                     /* encoded */
>         __le64 *prior_parent_snaps;        /* encoded */
> -       struct ceph_snap_realm *realm = NULL;
> +       struct ceph_snap_realm *realm;
>         struct ceph_snap_realm *first_realm = NULL;
>         struct ceph_snap_realm *realm_to_rebuild = NULL;
>         int rebuild_snapcs;
> @@ -775,6 +775,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
>
>         dout("%s deletion=%d\n", __func__, deletion);
>  more:
> +       realm = NULL;
>         rebuild_snapcs = 0;
>         ceph_decode_need(&p, e, sizeof(*ri), bad);
>         ri = p;
> --
> 2.31.1
>

Reviewed-by: Ilya Dryomov <idryomov@gmail.com>

Thanks,

                Ilya
Xiubo Li Nov. 9, 2022, 10:06 a.m. UTC | #2
On 09/11/2022 18:03, Ilya Dryomov wrote:
> On Wed, Nov 9, 2022 at 4:00 AM <xiubli@redhat.com> wrote:
>> From: Xiubo Li <xiubli@redhat.com>
>>
>> When decoding the snaps fails it maybe leaving the 'first_realm'
>> and 'realm' pointing to the same snaprealm memory. And then it'll
>> put it twice and could cause random use-after-free, BUG_ON, etc
>> issues.
>>
>> Cc: stable@vger.kernel.org
>> URL: https://tracker.ceph.com/issues/57686
>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>> ---
>>
>> Changed in V4:
>> - remove initilizing of 'realm'.
>>
>>   fs/ceph/snap.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
>> index 9bceed2ebda3..c1c452afa84d 100644
>> --- a/fs/ceph/snap.c
>> +++ b/fs/ceph/snap.c
>> @@ -764,7 +764,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
>>          struct ceph_mds_snap_realm *ri;    /* encoded */
>>          __le64 *snaps;                     /* encoded */
>>          __le64 *prior_parent_snaps;        /* encoded */
>> -       struct ceph_snap_realm *realm = NULL;
>> +       struct ceph_snap_realm *realm;
>>          struct ceph_snap_realm *first_realm = NULL;
>>          struct ceph_snap_realm *realm_to_rebuild = NULL;
>>          int rebuild_snapcs;
>> @@ -775,6 +775,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
>>
>>          dout("%s deletion=%d\n", __func__, deletion);
>>   more:
>> +       realm = NULL;
>>          rebuild_snapcs = 0;
>>          ceph_decode_need(&p, e, sizeof(*ri), bad);
>>          ri = p;
>> --
>> 2.31.1
>>
> Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Thanks very much Ilya!
>
> Thanks,
>
>                  Ilya
>
diff mbox series

Patch

diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 9bceed2ebda3..c1c452afa84d 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -764,7 +764,7 @@  int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
 	struct ceph_mds_snap_realm *ri;    /* encoded */
 	__le64 *snaps;                     /* encoded */
 	__le64 *prior_parent_snaps;        /* encoded */
-	struct ceph_snap_realm *realm = NULL;
+	struct ceph_snap_realm *realm;
 	struct ceph_snap_realm *first_realm = NULL;
 	struct ceph_snap_realm *realm_to_rebuild = NULL;
 	int rebuild_snapcs;
@@ -775,6 +775,7 @@  int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
 
 	dout("%s deletion=%d\n", __func__, deletion);
 more:
+	realm = NULL;
 	rebuild_snapcs = 0;
 	ceph_decode_need(&p, e, sizeof(*ri), bad);
 	ri = p;