Tags: patch
In Ubuntu, we've applied the attached patch to achieve the following:
- debian/patches/11-loadpng.patch: Fix FTBFS caused by ignoring
the return value of some functions:
+ src/init.c: check the return code of realpath.
+ src/loadpng.c: handle short reads.
We thought you might be interested in doing the same.
From: Artur Rona <[email protected]>
Description: Fix build errors caused by ignoring the return value of some functions.
- src/init.c: check the return code of realpath.
- src/loadpng.c: handle short reads.
Bug-Debian: http://bugs.debian.org/511922
Origin: http://launchpadlibrarian.net/21243066/xbubble_0.5.11.2-2_0.5.11.2-2ubuntu1.diff.gz
Author: James Westby <[email protected]>
diff -pruN 0.5.11.2-3/src/init.c 0.5.11.2-3ubuntu2/src/init.c
--- 0.5.11.2-3/src/init.c 2005-04-27 16:42:19.000000000 +0100
+++ 0.5.11.2-3ubuntu2/src/init.c 2010-03-08 22:38:42.000000000 +0000
@@ -97,7 +97,8 @@ static char * data_file( const char * fi
path_max = 4096;
#endif
abs_data_dir = (char *) xmalloc( path_max * sizeof(char));
- realpath( data_dir, abs_data_dir );
+ if (!realpath( data_dir, abs_data_dir ))
+ return NULL;
offset = strlen(abs_data_dir);
if ( offset > 1024-128 )
offset = 1024-128;
@@ -119,8 +120,9 @@ static char * data_file( const char * fi
}
-static void load_levels( const char * file ) {
+static void load_levels( const char * file_path ) {
FILE *fd;
+ char * file;
char line[128];
unsigned char r[8];
int i, cell = 0;
@@ -129,7 +131,11 @@ static void load_levels( const char * fi
int color, parse_error = 0;
nb_levels = 0;
- file = data_file(file, 0);
+ file = data_file(file_path, 0);
+ if ( file == NULL ) {
+ warn( _("cannot open levels file %s."), file_path);
+ return;
+ }
fd = fopen( file, "r" );
if ( fd == NULL ) {
@@ -232,6 +238,7 @@ static void add_font_path( char * path )
static XFontStruct * load_font( int pixel_size ) {
XFontStruct * xfont;
+ char * font_path;
char name[128];
int i;
static int added_font_path = 0;
@@ -245,7 +252,10 @@ static XFontStruct * load_font( int pixe
}
/* let's see if we can supply a font */
if ( ! added_font_path ) {
- add_font_path(data_file("",0));
+ font_path = data_file("", 0);
+ if ( font_path == NULL )
+ fail( _("couldn't determine path to load font !") );
+ add_font_path(font_path);
added_font_path = 1;
}
sprintf( name, SUPPLIED_FONT, pixel_size );
@@ -276,8 +286,13 @@ static Frame load_frame( char *file, dou
RgbaImage ri1;
RgbaImage ri2;
Frame frame = (Frame) xmalloc( sizeof( struct _Frame ));
+ char * png_file;
- ri1 = create_rgba_image_from_png_file(data_file(file,1));
+ png_file = data_file(file, 1);
+ if ( png_file == NULL ) {
+ fail(_("Couldn't get file to load frame from"));
+ }
+ ri1 = create_rgba_image_from_png_file(png_file);
/* ri2 = ( zoom < 1.0 )? scale_rgba_image( ri1, zoom, zoom ) : ri1; */
ri2 = scale_rgba_image( ri1, zoom, zoom ) ;
pmask = ( ri2->has_alpha )? &mask : NULL;
@@ -322,11 +337,16 @@ static Set load_animation( const char *f
char line[128];
char framename[128];
FILE *fd;
+ char * animation_file;
/* open animation description file */
- fd = fopen( data_file(filename,1), "r" );
+ animation_file = data_file(filename,1);
+ if ( animation_file == NULL ) {
+ fail(_("couldn't get file to load animation from"));
+ }
+ fd = fopen( animation_file, "r" );
if ( fd == NULL )
- fail( _("cannot open animation file %s."), data_file(filename,1) );
+ fail( _("cannot open animation file %s."), animation_file );
/* count frames */
while ( fgets( line, 128, fd ) != NULL ) {
@@ -362,7 +382,13 @@ static Set load_animation( const char *f
static void load_scaled_image( const char *file, Pixmap *pix, Pixmap *mask, double zoom ) {
RgbaImage ri1;
RgbaImage ri2;
- ri1 = create_rgba_image_from_png_file(data_file(file,1));
+ char * png_file;
+
+ png_file = data_file(file, 1);
+ if ( png_file == NULL ) {
+ fail(_("Couldn't load file to scale image"));
+ }
+ ri1 = create_rgba_image_from_png_file(png_file);
ri2 = ( zoom < 1.0 )? scale_rgba_image( ri1, zoom, zoom ) : ri1;
create_pixmaps_from_rgba_image( ri2, pix, mask );
delete_rgba_image(ri1);
@@ -390,8 +416,13 @@ static void make_canon_animation( double
Pixmap mask;
Frame frame;
int i;
+ char * canon_data_file;
- ri2 = create_rgba_image_from_png_file(data_file("canon.png",1));
+ canon_data_file = data_file("canon.png",1);
+ if ( canon_data_file == NULL ) {
+ fail(_("Couldn't load file for canon information"));
+ }
+ ri2 = create_rgba_image_from_png_file(canon_data_file);
ri2->hotx = CANON_CX;
ri2->hoty = CANON_CY;
ri = scale_rgba_image( ri2, zoom, zoom );
@@ -503,6 +534,9 @@ static void load_animations( double zoom
/* bubble animation */
dir = data_file("./",1);
+ if ( dir == NULL ) {
+ fail(_("couldn't get dir for loading bubble"));
+ }
n = scandir(dir, &namelist, diren_select_bubbles , alphasort);
if (n < 0) fail(_("Error while scanning %s"),dir);
@@ -747,6 +781,7 @@ void splash_screen( double zoom ) {
char * subtitle = _("Loading graphics ...");
const char *config_file = "config.txt";
+ char * config_data_file;
FILE *fd = NULL ;
char line[128];
char *copy = NULL;
@@ -759,7 +794,11 @@ void splash_screen( double zoom ) {
double newzoom = zoom;
int i;
- fd = fopen( data_file(config_file,1), "r" );
+ config_data_file = data_file(config_file,1);
+ if ( config_data_file == NULL ) {
+ fail(_("Couldn't find data file for splash screen"));
+ }
+ fd = fopen( config_data_file, "r" );
if(fd) { /* time to change default values... */
while ( fgets( line, 128, fd ) != NULL ) {
lc++;
diff -pruN 0.5.11.2-3/src/loadpng.c 0.5.11.2-3ubuntu2/src/loadpng.c
--- 0.5.11.2-3/src/loadpng.c 2005-04-22 17:13:04.000000000 +0100
+++ 0.5.11.2-3ubuntu2/src/loadpng.c 2010-03-08 22:38:42.000000000 +0000
@@ -18,6 +18,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
@@ -43,7 +44,8 @@ unsigned char * load_png_file( const cha
FILE *fd;
unsigned char *data;
unsigned char header[8];
- int bit_depth, color_type, i;
+ unsigned char *header_ptr;
+ int bit_depth, color_type, i, bytes_to_read, bytes_read;
png_uint_32 png_width, png_height, rowbytes;
png_structp png_ptr;
png_infop info_ptr;
@@ -55,7 +57,22 @@ unsigned char * load_png_file( const cha
return NULL;
}
/* ensure that we opened a PNG file */
- fread( header, 1, 8, fd );
+ bytes_to_read = 8;
+ header_ptr = header;
+ do {
+ bytes_read = fread( header_ptr, 1, bytes_to_read, fd );
+ if (bytes_read == bytes_to_read)
+ break;
+ if (bytes_read >= 0) {
+ bytes_to_read -= bytes_read;
+ header_ptr += bytes_read;
+ }
+ } while (bytes_read >= 0 || errno == EINTR);
+ if (bytes_read == 0) {
+ fclose(fd);
+ fprintf(stderr,_("Error reading from %s.\n"), file);
+ return NULL;
+ }
if ( ! png_check_sig( header, 8 ) ) {
fclose(fd);
fprintf(stderr,_("File %s does not have a valid PNG signature.\n"), file);