Re: [PR] fix: five memcpy calls in buffer/apr_buffer in apr_buffer.c [apr]
Daniel Sahlberg <[email protected]> Fri, 22 May 2026 10:35:30 +0200
| Newsgroups | gmane.comp.apache.apr.devel |
|---|---|
| Message-ID | <CAMHy98Ng-pQ2iAHWbQiJLPc5hyW1WyQ-f6oAhz1pBFC_9vebPg@mail.gmail.com> |
--0000000000002378d6065263ea24 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Den s=C3=B6n 17 maj 2026 kl 19:47 skrev Daniel Sahlberg < [email protected]>: > Den s=C3=B6n 17 maj 2026 kl 19:14 skrev orbisai0security (via GitHub) > <[email protected]>: > > > > > > orbisai0security commented on PR #73: > > URL: https://github.com/apache/apr/pull/73#issuecomment-4471676980 > > > > Thanks for the review. I agree that the current description > overstates the issue and incorrectly frames this as a confirmed critical > overflow. > > > > I=E2=80=99ll revise the PR to narrow it to defensive hardening only.= In > particular, I=E2=80=99ll remove the =E2=80=9Cfive memcpy calls=E2=80=9D /= =E2=80=9Ccritical severity=E2=80=9D > language and keep only the allocation-failure guard before memcpy(), sinc= e > calling memcpy with a NULL destination after alloc() failure would be > undefined behaviour. > > > > For the APR_BUFFER_MAX checks, I understand your point that they do > not prove that src->d.mem is actually backed by src->size bytes, so they = do > not fix the claimed issue. I=E2=80=99m happy to drop those from this PR u= nless you > think they are still useful as a separate invariant check. > > > > Would a smaller patch focused only on the alloc() NULL check, with > tests/docs adjusted for expected behaviour, be acceptable? > > I will refer this question to the rest of dev@ > > Cheers, > Daniel > Any takers? This is way above my paygrade :-) In the meantime I digged a bit further and I see that apr_pmemdup seems to do the same, it allocates a buffer and then immediately uses it: ... res =3D apr_palloc(a, n); memcpy(res, m, n); ... I realise that you can have an abort_fn in the pool and if you use apr_palloc as the alloc function you will get a callback, but you can't really avoid the memcpy(NULL, ...). But the fact that the pattern in apr_pmemdup is the same as in apr_buffer_cpy make me believe this is intentional. Or we have two bugs ;-) Cheers, Daniel --0000000000002378d6065263ea24 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div dir=3D"ltr">Den s=C3=B6n 17 maj 2026 kl 19:47 skrev D= aniel Sahlberg <<a href=3D"mailto:[email protected]">daniel.l.= [email protected]</a>>:</div><div class=3D"gmail_quote gmail_quote_cont= ainer"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;= border-left:1px solid rgb(204,204,204);padding-left:1ex">Den s=C3=B6n 17 ma= j 2026 kl 19:14 skrev orbisai0security (via GitHub)<br> <<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>&= gt;:<br> ><br> ><br> > orbisai0security commented on PR #73:<br> > URL: <a href=3D"https://github.com/apache/apr/pull/73#issuecomment-447= 1676980" rel=3D"noreferrer" target=3D"_blank">https://github.com/apache/apr= /pull/73#issuecomment-4471676980</a><br> ><br> >=C2=A0 =C2=A0 Thanks for the review. I agree that the current descripti= on overstates the issue and incorrectly frames this as a confirmed critical= overflow.<br> ><br> >=C2=A0 =C2=A0 I=E2=80=99ll revise the PR to narrow it to defensive hard= ening only. In particular, I=E2=80=99ll remove the =E2=80=9Cfive memcpy cal= ls=E2=80=9D / =E2=80=9Ccritical severity=E2=80=9D language and keep only th= e allocation-failure guard before memcpy(), since calling memcpy with a NUL= L destination after alloc() failure would be undefined behaviour.<br> ><br> >=C2=A0 =C2=A0 For the APR_BUFFER_MAX checks, I understand your point th= at they do not prove that src->d.mem is actually backed by src->size = bytes, so they do not fix the claimed issue. I=E2=80=99m happy to drop thos= e from this PR unless you think they are still useful as a separate invaria= nt check.<br> ><br> >=C2=A0 =C2=A0 Would a smaller patch focused only on the alloc() NULL ch= eck, with tests/docs adjusted for expected behaviour, be acceptable?<br> <br> I will refer this question to the rest of dev@<br> <br> Cheers,<br> Daniel<br></blockquote><div><br></div><div>Any takers? This is way above my= paygrade :-)</div><div><br></div><div>In the meantime I digged a bit furth= er and I see that apr_pmemdup seems to do the same, it allocates a buffer a= nd then immediately uses it:</div><div>...</div><div>=C2=A0 =C2=A0 res =3D = apr_palloc(a, n);<br>=C2=A0 =C2=A0 memcpy(res, m, n);</div><div>...</div><d= iv><br></div><div>I realise that you can have an abort_fn in the pool and i= f you use apr_palloc as the alloc function you will get a callback, but you= can't really avoid the memcpy(NULL, ...).</div><div><br></div><div>But= the fact that the pattern in apr_pmemdup is the same as in apr_buffer_cpy = make me believe this is intentional. Or we have two bugs ;-)</div><div><br>= </div><div>Cheers,</div><div>Daniel</div><div><br></div></div></div> --0000000000002378d6065263ea24--