doesn't include <stdio.h> before <jpeglib.h>

Bug #1342459 reported by Peter Cordes
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
libmng (Ubuntu)
Confirmed
Undecided
Unassigned

Bug Description

libmng 2.0.2-0ubuntu3 in Ubuntu 14.04 (trusty), gcc 4.8.

tldr summary: libmng_types.h should #include <stdio.h> before <jpeglib.h>. Could also check for HAVE_BOOLEAN being defined before defining it.

details:
http://www.freedesktop.org/wiki/Software/libjpeg/

"Applications using the JPEG library should include the header file jpeglib.h to obtain declarations of data types and routines. Before including jpeglib.h, include system headers that define at least the typedefs FILE and size_t."

 So libjpeg is a special snowflake and doesn't #include the necessary headers to define all the types it mentions. Presumably this is for small footprint things that don't need the stdio parts of libjpeg, and can hack something up to make it compile without pulling in <stdio.h>.

 libmng 2.0.2 doesn't do this, so this won't compile:
#include <libmng.h>
int main() { return 0; }

In file included from /usr/include/libmng_types.h:203:0,
                 from /usr/include/libmng.h:386,
                 from mng-inc.c:1:
/usr/include/jpeglib.h:1000:30: error: unknown type name ‘FILE’
 EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
                              ^
/usr/include/jpeglib.h:1001:29: error: unknown type name ‘FILE’
 EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));

 This breaks autoconf detection of libmng when compiling mplayer from source, for example.

 The obvious fix is for libmng_types.h to #include <stdio.h> right before jpeglib.h.

 If cleaning up the headers anyway, the typedef int boolean; apparently caused a problem for someone when compiling the GIMP with some version of jpeglib, as it includes jpeglib.h before libmng.h. https://sourceforge.net/p/png-mng/mailman/message/31502284/. (which I noticed since it showed up on the same page as the message about mplayer's autoconf test for libmng.)

 I had a look: jpeglib checks for but doesn't set HAVE_BOOLEAN, and libmng sets HAVE_BOOLEAN without checking.

// in jmorecfg.h
#ifndef HAVE_BOOLEAN
typedef int boolean;
#endif

// in libmng_types.h
#ifndef _WIN32
#define HAVE_BOOLEAN
typedef int boolean;
#endif

 It's not an error to have multiple identical typedefs, so presumably the problem happened with a different libjpeg version that defined boolean to something else. I'm not sure what the point of the logic is, though. Surely testing on #ifndef HAVE_BOOLEAN would be a good idea. i.e.

#if !defined(HAVE_BOOLEAN) && !defined(_WIN32)
#define HAVE_BOOLEAN
typedef int boolean;
#endif

 I assume the idea is to avoid defining it at all on win32. So I guess code that wants to compile on win32 depends on jpeglib.h (included by libmng.h) providing a typedef for boolean, or depends on having boolean defined by windows stuff. It might make more sense just to remove defining boolean from libmng_types.h altogether, if it can do without it and still compile on win32. This could break things if using libmng.h with a different jpeglib.h that didn't provide a typedef for boolean, so the safest would be the #if !defined(HAVE_BOOLEAN) && !defined(_WIN32) check.

 Anyway, both of these were reported on the mailing list right after 2.0.2 released, without replies or updates from upstream. And upstream's sourceforge ticket tracker (https://sourceforge.net/p/libmng/bugs/) doesn't allow ticket creation. So I'm reporting it here instead of trying to chase down upstream maintainers myself.

description: updated
Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in libmng (Ubuntu):
status: New → Confirmed
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.