On Tue, Feb 3, 2015 at 7:38 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Tue, Feb 3, 2015 at 7:00 AM, Siddhesh Poyarekar <siddh...@redhat.com> > wrote: >> ... and I forgot to add bug-gnulib to cc before I hit send. >> >> Siddhesh >> >> On Tue, Feb 03, 2015 at 08:26:49PM +0530, Siddhesh Poyarekar wrote: >>> Hi, >>> >>> obstack_init does not completely initialize the obstack structure; it >>> leaves out the padding bits and valgrind complains about it on s390x: >>> >>> ==15793== Memcheck, a memory error detector >>> ==15793== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. >>> ==15793== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info >>> ==15793== Command: /root/obstack >>> ==15793== >>> ==15793== Conditional jump or move depends on uninitialised value(s) >>> ==15793== at 0x403E48CA4E: obstack_free (in /lib64/libc-2.12.so) >>> ==15793== by 0x8000072D: main (obstack.c:12) >>> ==15793== >>> ==15793== >>> ==15793== HEAP SUMMARY: >>> ==15793== in use at exit: 0 bytes in 0 blocks >>> ==15793== total heap usage: 1 allocs, 1 frees, 4,064 bytes allocated >>> ==15793== >>> ==15793== All heap blocks were freed -- no leaks are possible >>> ==15793== >>> ==15793== For counts of detected and suppressed errors, rerun with: -v >>> ==15793== Use --track-origins=yes to see where uninitialised values come >>> from >>> ==15793== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4) >>> >>> >>> The fix below (against gnulib, but is identical for glibc) initializes >>> all of the obstack struct at once. Verified that the valgrind warning >>> is fixed. OK for 2.22 and gnulib? >>> >>> Siddhesh >>> >>> ChangeLog for gnulib: >>> >>> obstack: Initialize whole obstack structure. >>> * lib/obstack.c (_obstack_begin): Initialize all of H. >>> >>> ChangeLog for glibc: >>> >>> [BZ #17919] >>> * malloc/obstack.c (_obstack_begin): Initialize all of H. >>> >>> diff --git a/malloc/obstack.c b/malloc/obstack.c >>> index 5bb3f0d..c1d6ded 100644 >>> --- a/lib/obstack.c >>> +++ b/lib/obstack.c >>> @@ -148,6 +148,8 @@ _obstack_begin (struct obstack *h, >>> { >>> struct _obstack_chunk *chunk; /* points to new chunk */ >>> >>> + memset (h, 0, sizeof (struct obstack)); >>> + >>> if (alignment == 0) >>> alignment = DEFAULT_ALIGNMENT; >>> if (size == 0) >> >> > > I think you should also remove > > h->use_extra_arg = 0; >
And /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; -- H.J.