Package: qiv
Version: 2.0-4.2
Severity: minor
Tags: patch
Many of the calls to malloc() and realloc() are not checked for a NULL
return value, and are subsequently used under the assumption that a
valid pointer was returned. In the (addmittedly unlikely) case that
the system is unable to allocate the memory, qiv quits somewhat less
graciously than would be desirable.
I have attached my stock do-or-die memory handling functions (public
domain, but easily relicensable to GPL if desired), and a patch to
incorporate those functions into qiv. But, of course, it would be
just as easy to check the return of malloc at the call point or to
spin your own xmalloc...
I realize that the change is rather nitpicky, my appologies, but I
still think it could stand to be fixed. ;)
Cheers,
Kevin
-- System Information:
Debian Release: testing/unstable
APT prefers testing
APT policy: (990, 'testing'), (500, 'unstable')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.17.20060719a
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Versions of packages qiv depends on:
ii gdk-imlib11 1.9.14-30 imaging library for use with gtk
ii libc6 2.3.6-19 GNU C Library: Shared libraries
ii libglib1.2 1.2.10-10.1 The GLib library of C routines
ii libgtk1.2 1.2.10-18 The GIMP Toolkit set of widgets fo
ii libx11-6 2:1.0.0-7 X11 client-side library
ii libxext6 1:1.0.0-4 X11 miscellaneous extension librar
ii libxi6 1:1.0.0-5 X11 Input extension library
ii libxinerama1 1:1.0.1-4 X11 Xinerama extension library
qiv recommends no packages.
-- no debconf information
diff -ur qiv-2.0.orig/image.c qiv-2.0/image.c
--- qiv-2.0.orig/image.c 2006-08-14 15:08:45.000000000 -0600
+++ qiv-2.0/image.c 2006-08-14 21:55:29.000000000 -0600
@@ -14,6 +14,7 @@
#include <sys/stat.h>
#include <unistd.h>
#include "qiv.h"
+#include "xmalloc.h"
static void setup_win(qiv_image *);
static void really_set_static_grav(GdkWindow *);
@@ -230,7 +231,7 @@
gdk_window_set_back_pixmap(root_win, q->p, FALSE);
} else {
GdkGC *rootGC;
- buffer = calloc(1, screen_x * screen_y);
+ buffer = xcalloc(1, screen_x * screen_y);
rootGC = gdk_gc_new(root_win);
temp = gdk_pixmap_create_from_data(root_win, buffer, screen_x,
screen_y, gvis->depth, &image_bg, &image_bg);
diff -ur qiv-2.0.orig/Makefile qiv-2.0/Makefile
--- qiv-2.0.orig/Makefile 2006-08-14 15:08:45.000000000 -0600
+++ qiv-2.0/Makefile 2006-08-14 21:55:29.000000000 -0600
@@ -66,7 +66,7 @@
LIBS = `imlib-config --libs-gdk`
PROGRAM = qiv
-OBJS = main.o image.o event.o options.o utils.o
+OBJS = main.o image.o event.o options.o utils.o xmalloc.o
HEADERS = qiv.h
DEFINES = $(patsubst %,-DEXTN_%, $(EXTNS)) \
$(GETOPT_LONG) \
diff -ur qiv-2.0.orig/Makefile.Solaris qiv-2.0/Makefile.Solaris
--- qiv-2.0.orig/Makefile.Solaris 2006-08-14 15:08:45.000000000 -0600
+++ qiv-2.0/Makefile.Solaris 2006-08-14 21:55:55.000000000 -0600
@@ -66,7 +66,7 @@
LIBS = `imlib-config --libs-gdk` -R`imlib-config --prefix`/lib
PROGRAM = qiv
-OBJS = main.o image.o event.o options.o utils.o
+OBJS = main.o image.o event.o options.o utils.o xmalloc.o
HEADERS = qiv.h
DEFINES = $(patsubst %,-DEXTN_%, $(EXTNS)) \
$(GETOPT_LONG) \
diff -ur qiv-2.0.orig/options.c qiv-2.0/options.c
--- qiv-2.0.orig/options.c 2006-08-14 15:08:45.000000000 -0600
+++ qiv-2.0/options.c 2006-08-14 21:55:29.000000000 -0600
@@ -16,6 +16,7 @@
#else
#include "lib/getopt.h"
#endif
+#include "xmalloc.h"
extern char *optarg;
extern int optind, opterr, optopt;
@@ -297,7 +298,7 @@
if((cnt = argc - optind) > 0) {
if (!images) {
max_image_cnt = 8192;
- image_names = (char**)malloc(max_image_cnt * sizeof(char*));
+ image_names = (char**)xmalloc(max_image_cnt * sizeof(char*));
}
while (cnt-- > 0) {
if (stat(argv[optind], &sb) >= 0 && S_ISDIR(sb.st_mode)) {
@@ -307,7 +308,7 @@
else {
if (images >= max_image_cnt) {
max_image_cnt += 8192;
- image_names = (char**)realloc(image_names,max_image_cnt*sizeof(char*));
+ image_names = (char**)xrealloc(image_names,max_image_cnt*sizeof(char*));
}
image_names[images++] = argv[optind++];
}
diff -ur qiv-2.0.orig/utils.c qiv-2.0/utils.c
--- qiv-2.0.orig/utils.c 2006-08-14 15:08:45.000000000 -0600
+++ qiv-2.0/utils.c 2006-08-14 21:55:29.000000000 -0600
@@ -17,6 +17,7 @@
#include <fcntl.h>
#include <errno.h>
#include "qiv.h"
+#include "xmalloc.h"
#ifdef STAT_MACROS_BROKEN
#undef S_ISDIR
@@ -86,7 +87,7 @@
qiv_deletedfile *del;
if (!deleted_files)
- deleted_files = (qiv_deletedfile*)calloc(MAX_DELETE,sizeof *deleted_files);
+ deleted_files = (qiv_deletedfile*)xcalloc(MAX_DELETE,sizeof *deleted_files);
del = &deleted_files[delete_idx++];
if (delete_idx == MAX_DELETE)
@@ -248,7 +249,7 @@
stat(filename, &before);
if (!buffer)
- buffer = malloc(MAXOUTPUTBUFFER + 1);
+ buffer = xmalloc(MAXOUTPUTBUFFER + 1);
*numlines = 0;
*output = lines;
@@ -503,7 +504,7 @@
int n,m,p,q;
if (!rindices)
- rindices = (int *) malloc((unsigned) max_rand_num*sizeof(int));
+ rindices = (int *) xmalloc((unsigned) max_rand_num*sizeof(int));
if (rsize != num) {
rsize = num;
index = -1;
@@ -558,9 +559,9 @@
if (images >= max_image_cnt) {
max_image_cnt += 8192;
if (!image_names)
- image_names = (char**)malloc(max_image_cnt * sizeof(char*));
+ image_names = (char**)xmalloc(max_image_cnt * sizeof(char*));
else
- image_names = (char**)realloc(image_names,max_image_cnt*sizeof(char*));
+ image_names = (char**)xrealloc(image_names,max_image_cnt*sizeof(char*));
}
image_names[images++] = strdup(name);
}
@@ -581,7 +582,7 @@
if (!images) {
max_image_cnt = 8192;
- image_names = (char**)malloc(max_image_cnt * sizeof(char*));
+ image_names = (char**)xmalloc(max_image_cnt * sizeof(char*));
}
while (1) {
@@ -603,7 +604,7 @@
else {
if (images >= max_image_cnt) {
max_image_cnt += 8192;
- image_names = (char**)realloc(image_names,max_image_cnt*sizeof(char*));
+ image_names = (char**)xrealloc(image_names,max_image_cnt*sizeof(char*));
}
image_names[images++] = strdup(line);
}
/* xmalloc.c - Do-or-die Memory management functions.
*
* Created by Kevin Locke (from numerous canonical examples)
*
* I hereby place this file in the public domain. It may be freely reproduced,
* distributed, used, modified, built upon, or otherwise employed by anyone
* for any purpose without restriction.
*/
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#endif
void *xmalloc(size_t size)
{
void *allocated = malloc(size);
if (allocated == NULL) {
fprintf(stderr, "Error: Insufficient memory "
# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
"(attempt to malloc %zu bytes)\n",
#else
"(attempt to malloc %u bytes)\n",
#endif
size);
exit(EXIT_FAILURE);
}
return allocated;
}
void *xcalloc(size_t num, size_t size)
{
void *allocated = calloc(num, size);
if (allocated == NULL) {
fprintf(stderr, "Error: Insufficient memory "
# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
"(attempt to calloc %zu bytes)\n",
#else
"(attempt to calloc %u bytes)\n",
#endif
size);
exit(EXIT_FAILURE);
}
return allocated;
}
void *xrealloc(void *ptr, size_t size)
{
void *allocated;
/* Protect against non-standard behavior */
if (ptr == NULL) {
allocated = malloc(size);
} else {
allocated = realloc(ptr, size);
}
if (allocated == NULL) {
fprintf(stderr, "Error: Insufficient memory "
# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
"(attempt to realloc %zu bytes)\n",
#else
"(attempt to realloc %u bytes)\n",
#endif
size);
exit(EXIT_FAILURE);
}
return allocated;
}
/* xmalloc.h - Header for do-or-die memory management functions.
*
* Created by Kevin Locke (to accompany xmalloc.c)
*
* I hereby place this file in the public domain. It may be freely reproduced,
* distributed, used, modified, built upon, or otherwise employed by anyone
* for any purpose without restriction.
*/
extern void *xmalloc(size_t size);
extern void *xcalloc(size_t num, size_t size);
extern void *xrealloc(void *ptr, size_t size);