--- Begin Message ---
Package: gqcam
Version: 0.9.1-5
Severity: important
If gqcam is closed with Alt+F4 and not with File/Quit menu item then
the ~/.gqcamrc will be corrupted.
How to reproduce: first apply the attached debug patch then compile and
run gqcam. Press Alt+F4 to close gqcam.
$ rm ~/.gqcamrc
$ gqcam-0.9.1/gqcam -v /dev/video0
gqcam.c:459: &camera=0x8058640
frontend.c:605: camera=0x8058640
frontend.c:653: camera=0x8058640
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
Error reading image...
camera->inputtype=0x0
gqcam.c:400: camera=0x8458798
gqcam.c:401: camera->inputtype=0x845A908
preferences.c:205: camera=0x8458798
Error reading image...
$ cat ~/.gqcamrc
autobrightness 0
swaprgb 4
inputtype 138782984
As you can see the "camera" pointer at gqcam.c:delete_event() is already wrong
(0x8458798 instead of 0x8058640) which means that the saved .gqcamrc file will
be corrupted.
diff -upr gqcam-0.9.1.orig/frontend.c gqcam-0.9.1/frontend.c
--- gqcam-0.9.1.orig/frontend.c 2008-10-19 12:35:45.000000000 +0200
+++ gqcam-0.9.1/frontend.c 2008-10-19 12:38:52.000000000 +0200
@@ -443,6 +443,8 @@ void dock_controls(GtkWidget *widget, st
camera->controlwindow = gtk_window_new(GTK_WINDOW_DIALOG);
gtk_container_add (GTK_CONTAINER(camera->controlwindow), camera->controltop);
gtk_window_set_title(GTK_WINDOW (camera->controlwindow), "Gqcam - Control Panel");
+
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
gtk_signal_connect (GTK_OBJECT (camera->controlwindow), "delete_event",
GTK_SIGNAL_FUNC (close_controls), camera);
gtk_widget_show(camera->controlwindow);
@@ -599,6 +601,8 @@ int create_frontend(struct Camera *camer
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), title);
gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, TRUE);
+
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC (delete_event), camera);
@@ -645,6 +649,8 @@ int create_frontend(struct Camera *camer
quititem = gtk_menu_item_new_with_label("Quit");
gtk_menu_append(GTK_MENU(filemenu), quititem);
+
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
gtk_signal_connect(GTK_OBJECT (quititem), "activate",
GTK_SIGNAL_FUNC (delete_event),
camera);
diff -upr gqcam-0.9.1.orig/gqcam.c gqcam-0.9.1/gqcam.c
--- gqcam-0.9.1.orig/gqcam.c 2008-10-19 12:35:45.000000000 +0200
+++ gqcam-0.9.1/gqcam.c 2008-10-19 12:42:15.000000000 +0200
@@ -287,6 +287,8 @@ void grab_image(struct Camera *camera)
while ( !plsquit ) {
// order matters! the sem_waits MUST be before the mutex lock
+ printf("camera->inputtype=0x%X\n", camera->inputtype);
+
if( !sem_wait( &s_grab1 ) && ( camera->speed_fastest || !sem_wait( &s_grab2 ) ) && !pthread_mutex_lock( &camera->freeze_mutex ) && !pthread_mutex_lock( &camera->iscam_mutex )){
pthread_mutex_lock( &camera->pref_mutex );
@@ -395,6 +397,9 @@ void delete_event(GtkWidget *widget, str
char * savefile;
char * path = "/.gqcamrc";
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
+ printf("%s:%u: camera->inputtype=0x%X\n", __FILE__, __LINE__, camera->inputtype);
+
if((home = getenv("HOME")) != NULL && (savefile = malloc(strlen(home)
+ strlen(path) + 1)) != NULL)
{
@@ -451,6 +456,7 @@ int main(int argc, char *argv[])
int done = 0;
FILE *preffile;
+ printf("%s:%u: &camera=%p\n", __FILE__, __LINE__, &camera);
init_cam(&camera);
/*
g_thread_init(NULL);
diff -upr gqcam-0.9.1.orig/preferences.c gqcam-0.9.1/preferences.c
--- gqcam-0.9.1.orig/preferences.c 2005-04-04 03:25:09.000000000 +0200
+++ gqcam-0.9.1/preferences.c 2008-10-19 12:22:33.000000000 +0200
@@ -65,6 +65,7 @@ void pref_dialog(GtkWidget *widget, stru
GtkWidget *label;
*/
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
camera->pref_dialog.prefdialog = gtk_dialog_new();
camera->pref_dialog.prefnotebook = gtk_notebook_new();
@@ -180,6 +181,7 @@ void read_pref_file(FILE *input, struct
char buff[1024], command[1024];
int val=0;
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
while(fgets(buff, sizeof(buff), input) != NULL){
if((buff[0] != '#') && (buff[0] != '\n'))
{
@@ -200,6 +202,7 @@ void read_pref_file(FILE *input, struct
void save_pref_file(FILE *output, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
fprintf(output, "autobrightness %d\n", camera->autobright);
fprintf(output, "swaprgb %d\n", camera->swapcolors);
fprintf(output, "inputtype %d\n", camera->inputtype);
@@ -207,6 +210,7 @@ void save_pref_file(FILE *output, struct
void ok_prefs(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
apply_prefs(widget, camera);
closedialog(widget, camera->pref_dialog.prefdialog);
}
@@ -214,6 +218,7 @@ void ok_prefs(GtkWidget *widget, struct
void apply_prefs(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(camera->pref_dialog.rgbswap)))
camera->swapcolors = 1;
else
diff -upr gqcam-0.9.1.orig/timer.c gqcam-0.9.1/timer.c
--- gqcam-0.9.1.orig/timer.c 2008-10-19 12:35:45.000000000 +0200
+++ gqcam-0.9.1/timer.c 2008-10-19 12:20:13.000000000 +0200
@@ -39,21 +39,25 @@
void set_timer_seconds(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
camera->timer_struct.unit = SECONDS;
}
void set_timer_minutes(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
camera->timer_struct.unit = MINUTES;
}
void timer_snap_now(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
next_frame(camera);
}
void timer_stop_timer(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
camera->on_timer = 0;
gtk_timeout_remove(camera->timeoutid);
if(!camera->timeout)
@@ -75,6 +79,7 @@ void timer_ok(GtkWidget *widget, struct
int timeout;
char snaplabeltext[30];
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
if(strlen(gtk_entry_get_text(GTK_ENTRY(camera->timer_struct.commandentry))) > 255){
printf("Command too long...\n");
return;
@@ -140,6 +145,7 @@ void timer_ok(GtkWidget *widget, struct
void timer_cancel(GtkWidget *widget, struct Camera *camera)
{
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
//camera->on_timer = 0;
gtk_widget_destroy(camera->timer_struct.timerdialog);
}
@@ -163,6 +169,7 @@ void set_timer(GtkWidget *widget, struct
GtkWidget *okbutton;
GtkWidget *cancelbutton;
*/
+ printf("%s:%u: camera=%p\n", __FILE__, __LINE__, camera);
// camera->on_timer = 1;
camera->timer_struct.timerdialog = gtk_dialog_new();
--- End Message ---