[Question] How does obstack deal with the specific valid address in obstack_free ?
TU Haoxin
haoxintu.2020@phdcs.smu.edu.sg
Thu Dec 16 01:09:12 GMT 2021
Dear developers,
I hope it's fine for me to ask you a question, please forgive me if not. I just have a question about the implementation intention of obstack_free.
The question is about the intention of how does obstack_free free an address at the bottom of a chunk in the obstack. Here is a quick demonstration code: https://godbolt.org/z/arv4ha19b
My point here is that the address "string_obstack->chunk" in obstrack_free (line 40) is a valid address from this chunk, and it should be freed normally as other pointers (execute this line will crash). However, it seems the current obstack_free function can not handle it and it will finally get an abort failure. (please refer to the gdb-log.txt in the attachment, as well as the testing code and the compiling script, for more details).
I found this "issue" when I tested the library using the symbolic execution technique. Again, I am not sure whether it's an issue or not. If so, the possible fixing is just changing the if condition "__obj > (void *) __o->chunk" to "__obj >= (void *) __o->chunk". Or if not, is it the intention of the obstack implementation to do so? Or in what purpose does obstack not support free from that specific address? Since the obstack is widely used, I guess it's quite important to avoid any potential issues in the implementation code.
obstack_free defined in "obstack.h"
```
# define obstack_free(OBSTACK, OBJ) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
void *__obj = (OBJ); \
if (__obj > (void *) __o->chunk && __obj < (void *) __o->chunk_limit) \
__o->next_free = __o->object_base = (char *) __obj; \
else (__obstack_free) (__o, __obj); })
```
Any suggestions or comments are welcome!
Thank you very much for your time and waiting for your reply~
Best regards,
Haoxin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: compile.sh
Type: text/x-sh
Size: 259 bytes
Desc: compile.sh
URL: <https://sourceware.org/pipermail/libc-help/attachments/20211216/eec3fa51/attachment-0001.bin>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: obstack-test.c
URL: <https://sourceware.org/pipermail/libc-help/attachments/20211216/eec3fa51/attachment-0001.c>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gdb-log.txt
URL: <https://sourceware.org/pipermail/libc-help/attachments/20211216/eec3fa51/attachment-0001.txt>
More information about the Libc-help
mailing list