NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/58136 (Use after free in libintl pgettext)
The following reply was made to PR lib/58136; it has been noted by GNATS.
From: Rob Whitlock <rwhitlock22%gmail.com@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: lib-bug-people%netbsd.org@localhost,
gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost,
stix%stix.id.au@localhost
Subject: Re: lib/58136 (Use after free in libintl pgettext)
Date: Mon, 19 Aug 2024 18:01:26 -0400
> On Aug 19, 2024, at 7:50 AM, gnats-admin%netbsd.org@localhost wrote:
>=20
> The following reply was made to PR lib/58136; it has been noted by =
GNATS.
>=20
> From: Paul Ripke <stix%stix.id.au@localhost>
> To: gnats-bugs%netbsd.org@localhost
> Cc:=20
> Subject: Re: lib/58136 (Use after free in libintl pgettext)
> Date: Mon, 19 Aug 2024 21:45:04 +1000
>=20
> =46rom my reading of C's behaviour, dereferencing a freed pointer is =
undefined
> behaviour, obviously. But using the pointer value should not be? =
Indeed, when
> compiled with clang/llvm, your code results in only one call to free.
In N1256 (a C99 draft) section 6.2.4p2, it says
The /lifetime/ of an object is the portion of program execution during =
which
storage is guaranteed to be reserved for it. An object exists, has a =
constant
address,^25) and retains its last-stored value throughout its =
lifetime.^26) If
an object is referred to outside of its lifetime, the behavior is =
undefined. The
value of a pointer becomes indeterminate when the object it points to
reaches the end of its lifetime.
Section 7.20.3 describes the malloc, calloc, realloc, and free =
functions. Section
7.20.3p1 contains the sentence
The lifetime of an allocated object extends from the allocation until =
the
deallocation.
Section 3.17.2 defines "indeterminate value" as
either an unspecified value or a trap representation
Section 3.17.3 defines "unspecified value" as
valid value of the relevant type where this International Standard =
imposes
no requirements on which value is chosen in any instance
NOTE An unspecified value cannot be a trap representation
Putting this together, we can see that accessing the value of a pointer =
after
it has been freed can result in a meaningless value or a trap.
ANSI C says something slightly different. Section 6.1.2.4 of ANSI C says
An object has a /storage duration/ that determines its lifetime. =
There are
two storage durations: static and automatic.
An object whose identifier is declared with external or internal =
linkage, or
with the storage-class specifier static has /static storage duration/. =
For such
an object, storage is reserved and its stored value is initialized =
only once,
prior to program startup. The object exists and retains its =
last-stored value
throughout the execution of the program.^15
An object whose identifier is declared with no linkage and without =
the
storage-class specifier static has /automatic storage duration/. =
Storage is
guaranteed to be reserved for a new instance of such an object on each
normal entry into the block with which it is associated, or on a jump =
from
outside the block to a labeled statement in the block or in an =
enclosed
block. In an initialization is specified for the value stored in the =
object, it is
performed on each normal entry, but not if the block is entered by a =
jump
to a labeled statement. Storage for the object is no longer guaranteed =
to
be reserved when execution of a block ends in any way. (Entering an
enclosed block suspends but does not end execution of the enclosing
block. Calling a function suspends but does not end execution of the
block containing the call.) The value of a pointer that referred to an =
object
with automatic storage duration that is no longer guaranteed to be
reserved is indeterminate.
Section 7.10.3 addresses malloc, calloc, realloc and free, and contains
the sentence
The value of a pointer that refers to freed space is indeterminate.
Section 3.16 defines "undefined behavior" as
Behavior, upon use of a nonportable or erroneous program construct,
of erroneous data, or of indeterminately valued objects, for which =
this
International Standard imposes no requirements. Permissible undefined
behavior ranges from ignoring the situation completely with =
unpredictable
results, to behaving during translation or program execution in a
documented manner characteristic of the environment (with or without
issuance of a diagnostic message), to terminating a translation or
execution (with the issuance of a diagnostic message).
If a "shall" or "shall not" requirement that appears outside of a =
constraint
is violated, the behavior is undefined. Undefined behavior is =
otherwise
indicated in this International Standard by the words "undefined =
behavior"
or by the omission of any explicit definition of behavior. There is no
difference in emphasis among these three; they all describe "behavior
that is undefined."
Putting these together, we see that accessing a pointer after is has =
been freed is undefined behavior in ANSI C.
> Agreed on the missing test, though. This code is old and crufty, does =
it have
> any coverage at all? I didn't see any after a brief look.
>=20
> --=20
> Paul Ripke
> "Great minds discuss ideas, average minds discuss events, small minds
> discuss people."
> -- Disputed: Often attributed to Eleanor Roosevelt. 1948.
>=20
Home |
Main Index |
Thread Index |
Old Index