* [bug report] ceph: decode interval_sets for delegated inos
@ 2024-12-03 8:19 Dan Carpenter
2024-12-03 8:25 ` Dan Carpenter
2024-12-03 17:06 ` Alex Elder
0 siblings, 2 replies; 8+ messages in thread
From: Dan Carpenter @ 2024-12-03 8:19 UTC (permalink / raw)
To: Jeff Layton; +Cc: ceph-devel
Hello Jeff Layton,
Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
from Nov 15, 2019 (linux-next), leads to the following Smatch static
checker warning:
fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
fs/ceph/mds_client.c
637 static int ceph_parse_deleg_inos(void **p, void *end,
638 struct ceph_mds_session *s)
639 {
640 u32 sets;
641
642 ceph_decode_32_safe(p, end, sets, bad);
^^^^
set to user data here.
643 if (sets)
--> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
^^^^^^^^^^^^^^^^^^^^^^^^^
This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
645 return 0;
646 bad:
647 return -EIO;
648 }
649
650 u64 ceph_get_deleg_ino(struct ceph_mds_session *s)
651 {
652 return 0;
653 }
654
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-03 8:19 [bug report] ceph: decode interval_sets for delegated inos Dan Carpenter
@ 2024-12-03 8:25 ` Dan Carpenter
2024-12-03 14:07 ` Jeff Layton
2024-12-03 17:06 ` Alex Elder
1 sibling, 1 reply; 8+ messages in thread
From: Dan Carpenter @ 2024-12-03 8:25 UTC (permalink / raw)
To: Jeff Layton; +Cc: ceph-devel
On Tue, Dec 03, 2024 at 11:19:25AM +0300, Dan Carpenter wrote:
> Hello Jeff Layton,
>
> Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> from Nov 15, 2019 (linux-next), leads to the following Smatch static
> checker warning:
>
> fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
>
> fs/ceph/mds_client.c
> 637 static int ceph_parse_deleg_inos(void **p, void *end,
> 638 struct ceph_mds_session *s)
> 639 {
> 640 u32 sets;
> 641
> 642 ceph_decode_32_safe(p, end, sets, bad);
> ^^^^
> set to user data here.
>
> 643 if (sets)
> --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
>
Smatch has similar warnings in ceph_mdsmap_decode().
fs/ceph/mdsmap.c:228 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow 'num_export_targets * 4' '0-u32max * 4'
fs/ceph/mdsmap.c:280 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '8 * (n + 1)' '8 * s32min-s32max'
fs/ceph/mdsmap.c:337 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '4 * n' '4 * 0-u32max'
fs/ceph/mdsmap.c:339 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '4 * n' '4 * 0-u32max'
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-03 8:25 ` Dan Carpenter
@ 2024-12-03 14:07 ` Jeff Layton
0 siblings, 0 replies; 8+ messages in thread
From: Jeff Layton @ 2024-12-03 14:07 UTC (permalink / raw)
To: Dan Carpenter; +Cc: ceph-devel
On Tue, 2024-12-03 at 11:25 +0300, Dan Carpenter wrote:
> On Tue, Dec 03, 2024 at 11:19:25AM +0300, Dan Carpenter wrote:
> > Hello Jeff Layton,
> >
> > Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> > from Nov 15, 2019 (linux-next), leads to the following Smatch static
> > checker warning:
> >
> > fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> > warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
> >
> > fs/ceph/mds_client.c
> > 637 static int ceph_parse_deleg_inos(void **p, void *end,
> > 638 struct ceph_mds_session *s)
> > 639 {
> > 640 u32 sets;
> > 641
> > 642 ceph_decode_32_safe(p, end, sets, bad);
> > ^^^^
> > set to user data here.
> >
> > 643 if (sets)
> > --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> > ^^^^^^^^^^^^^^^^^^^^^^^^^
> > This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
> >
In practice, the MDS is only sending a few sets at a time, so this is
an unlikely overflow. Probably, the right fix is to just clamp "sets"
at some value. Maybe 1K or 1M or so? I'd probably rather the Ceph folks
propose a patch for this since I'm not heavily involved there these
days.
> Smatch has similar warnings in ceph_mdsmap_decode().
>
> fs/ceph/mdsmap.c:228 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow 'num_export_targets * 4' '0-u32max * 4'
> fs/ceph/mdsmap.c:280 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '8 * (n + 1)' '8 * s32min-s32max'
> fs/ceph/mdsmap.c:337 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '4 * n' '4 * 0-u32max'
> fs/ceph/mdsmap.c:339 ceph_mdsmap_decode() warn: potential user controlled sizeof overflow '4 * n' '4 * 0-u32max'
>
Yeah, the mdsmap decoding definitely has some warts. It'd be good to
fix up some of those too so that they can never be a problem.
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-03 8:19 [bug report] ceph: decode interval_sets for delegated inos Dan Carpenter
2024-12-03 8:25 ` Dan Carpenter
@ 2024-12-03 17:06 ` Alex Elder
2024-12-03 18:29 ` Dan Carpenter
1 sibling, 1 reply; 8+ messages in thread
From: Alex Elder @ 2024-12-03 17:06 UTC (permalink / raw)
To: Dan Carpenter, Jeff Layton; +Cc: ceph-devel
On 12/3/24 2:19 AM, Dan Carpenter wrote:
> Hello Jeff Layton,
>
> Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> from Nov 15, 2019 (linux-next), leads to the following Smatch static
> checker warning:
>
> fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
>
> fs/ceph/mds_client.c
> 637 static int ceph_parse_deleg_inos(void **p, void *end,
> 638 struct ceph_mds_session *s)
> 639 {
> 640 u32 sets;
> 641
> 642 ceph_decode_32_safe(p, end, sets, bad);
> ^^^^
> set to user data here.
>
> 643 if (sets)
> --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
So the point of this is that "sets" is u32, and because that is
multiplied by 16 when passed to ceph_decode_skip_n(), the result
could exceed 32 bits? I.e., would this address it?
if (sets) {
size_t scale = 2 * sizeof(__le64);
if (sets < SIZE_MAX / scale)
ceph_decode_skip_n(p, end, sets * scale, bad);
else
goto bad;
}
-Alex
> 645 return 0;
> 646 bad:
> 647 return -EIO;
> 648 }
> 649
> 650 u64 ceph_get_deleg_ino(struct ceph_mds_session *s)
> 651 {
> 652 return 0;
> 653 }
> 654
>
> regards,
> dan carpenter
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-03 17:06 ` Alex Elder
@ 2024-12-03 18:29 ` Dan Carpenter
2024-12-04 12:50 ` Alex Markuze
0 siblings, 1 reply; 8+ messages in thread
From: Dan Carpenter @ 2024-12-03 18:29 UTC (permalink / raw)
To: Alex Elder; +Cc: Jeff Layton, ceph-devel
On Tue, Dec 03, 2024 at 11:06:50AM -0600, Alex Elder wrote:
> On 12/3/24 2:19 AM, Dan Carpenter wrote:
> > Hello Jeff Layton,
> >
> > Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> > from Nov 15, 2019 (linux-next), leads to the following Smatch static
> > checker warning:
> >
> > fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> > warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
> >
> > fs/ceph/mds_client.c
> > 637 static int ceph_parse_deleg_inos(void **p, void *end,
> > 638 struct ceph_mds_session *s)
> > 639 {
> > 640 u32 sets;
> > 641
> > 642 ceph_decode_32_safe(p, end, sets, bad);
> > ^^^^
> > set to user data here.
> >
> > 643 if (sets)
> > --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> > ^^^^^^^^^^^^^^^^^^^^^^^^^
> > This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
>
> So the point of this is that "sets" is u32, and because that is
> multiplied by 16 when passed to ceph_decode_skip_n(), the result
> could exceed 32 bits? I.e., would this address it?
>
> if (sets) {
> size_t scale = 2 * sizeof(__le64);
>
> if (sets < SIZE_MAX / scale)
> ceph_decode_skip_n(p, end, sets * scale, bad);
> else
> goto bad;
> }
>
Yes, that works. I don't know if there are any static checker warnings which
will complain that the "sets < SIZE_MAX / scale" is always true on 64 bit. I
don't think there is?
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-03 18:29 ` Dan Carpenter
@ 2024-12-04 12:50 ` Alex Markuze
2024-12-04 13:12 ` Alex Markuze
0 siblings, 1 reply; 8+ messages in thread
From: Alex Markuze @ 2024-12-04 12:50 UTC (permalink / raw)
To: Dan Carpenter; +Cc: Alex Elder, Jeff Layton, ceph-devel
I assume a Coccinelle patch can be written, if one doesn't exist yet.
On Tue, Dec 3, 2024 at 8:29 PM Dan Carpenter <dan.carpenter@linaro.org> wrote:
>
> On Tue, Dec 03, 2024 at 11:06:50AM -0600, Alex Elder wrote:
> > On 12/3/24 2:19 AM, Dan Carpenter wrote:
> > > Hello Jeff Layton,
> > >
> > > Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> > > from Nov 15, 2019 (linux-next), leads to the following Smatch static
> > > checker warning:
> > >
> > > fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> > > warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
> > >
> > > fs/ceph/mds_client.c
> > > 637 static int ceph_parse_deleg_inos(void **p, void *end,
> > > 638 struct ceph_mds_session *s)
> > > 639 {
> > > 640 u32 sets;
> > > 641
> > > 642 ceph_decode_32_safe(p, end, sets, bad);
> > > ^^^^
> > > set to user data here.
> > >
> > > 643 if (sets)
> > > --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> > > ^^^^^^^^^^^^^^^^^^^^^^^^^
> > > This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
> >
> > So the point of this is that "sets" is u32, and because that is
> > multiplied by 16 when passed to ceph_decode_skip_n(), the result
> > could exceed 32 bits? I.e., would this address it?
> >
> > if (sets) {
> > size_t scale = 2 * sizeof(__le64);
> >
> > if (sets < SIZE_MAX / scale)
> > ceph_decode_skip_n(p, end, sets * scale, bad);
> > else
> > goto bad;
> > }
> >
>
> Yes, that works. I don't know if there are any static checker warnings which
> will complain that the "sets < SIZE_MAX / scale" is always true on 64 bit. I
> don't think there is?
>
> regards,
> dan carpenter
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-04 12:50 ` Alex Markuze
@ 2024-12-04 13:12 ` Alex Markuze
2024-12-04 17:05 ` Dan Carpenter
0 siblings, 1 reply; 8+ messages in thread
From: Alex Markuze @ 2024-12-04 13:12 UTC (permalink / raw)
To: Dan Carpenter; +Cc: Alex Elder, Jeff Layton, ceph-devel
Dan, how are you running smatch?
I've been looking at smatch warnings/errors and don't get this error.
Do you have a custom smatch checker?
On Wed, Dec 4, 2024 at 2:50 PM Alex Markuze <amarkuze@redhat.com> wrote:
>
> I assume a Coccinelle patch can be written, if one doesn't exist yet.
>
> On Tue, Dec 3, 2024 at 8:29 PM Dan Carpenter <dan.carpenter@linaro.org> wrote:
> >
> > On Tue, Dec 03, 2024 at 11:06:50AM -0600, Alex Elder wrote:
> > > On 12/3/24 2:19 AM, Dan Carpenter wrote:
> > > > Hello Jeff Layton,
> > > >
> > > > Commit d48464878708 ("ceph: decode interval_sets for delegated inos")
> > > > from Nov 15, 2019 (linux-next), leads to the following Smatch static
> > > > checker warning:
> > > >
> > > > fs/ceph/mds_client.c:644 ceph_parse_deleg_inos()
> > > > warn: potential user controlled sizeof overflow 'sets * 2 * 8' '0-u32max * 8'
> > > >
> > > > fs/ceph/mds_client.c
> > > > 637 static int ceph_parse_deleg_inos(void **p, void *end,
> > > > 638 struct ceph_mds_session *s)
> > > > 639 {
> > > > 640 u32 sets;
> > > > 641
> > > > 642 ceph_decode_32_safe(p, end, sets, bad);
> > > > ^^^^
> > > > set to user data here.
> > > >
> > > > 643 if (sets)
> > > > --> 644 ceph_decode_skip_n(p, end, sets * 2 * sizeof(__le64), bad);
> > > > ^^^^^^^^^^^^^^^^^^^^^^^^^
> > > > This is safe on 64bit but on 32bit systems it can integer overflow/wrap.
> > >
> > > So the point of this is that "sets" is u32, and because that is
> > > multiplied by 16 when passed to ceph_decode_skip_n(), the result
> > > could exceed 32 bits? I.e., would this address it?
> > >
> > > if (sets) {
> > > size_t scale = 2 * sizeof(__le64);
> > >
> > > if (sets < SIZE_MAX / scale)
> > > ceph_decode_skip_n(p, end, sets * scale, bad);
> > > else
> > > goto bad;
> > > }
> > >
> >
> > Yes, that works. I don't know if there are any static checker warnings which
> > will complain that the "sets < SIZE_MAX / scale" is always true on 64 bit. I
> > don't think there is?
> >
> > regards,
> > dan carpenter
> >
> >
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [bug report] ceph: decode interval_sets for delegated inos
2024-12-04 13:12 ` Alex Markuze
@ 2024-12-04 17:05 ` Dan Carpenter
0 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2024-12-04 17:05 UTC (permalink / raw)
To: Alex Markuze; +Cc: Alex Elder, Jeff Layton, ceph-devel
On Wed, Dec 04, 2024 at 03:12:31PM +0200, Alex Markuze wrote:
> Dan, how are you running smatch?
> I've been looking at smatch warnings/errors and don't get this error.
> Do you have a custom smatch checker?
This is released code, but there are two possible explanations for why you
wouldn't see the warning:
1) Are you using the cross function database? Each time you rebuild the
database then it adds another layer to the call tree. EDIT: But
actually in this case, it doesn't matter because Smatch hardcodes
ceph_decode_64() as returning user data so the database isn't
required.
2) This bug only affects 32bit .configs and I suspect you're building for
64bit kernels.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-12-04 17:05 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-03 8:19 [bug report] ceph: decode interval_sets for delegated inos Dan Carpenter
2024-12-03 8:25 ` Dan Carpenter
2024-12-03 14:07 ` Jeff Layton
2024-12-03 17:06 ` Alex Elder
2024-12-03 18:29 ` Dan Carpenter
2024-12-04 12:50 ` Alex Markuze
2024-12-04 13:12 ` Alex Markuze
2024-12-04 17:05 ` Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.