Hello,
I tried to reproduce the crash.
It happens just after trying to execute something.

History handling uses an array of pointer to char.
Unfortunately it is stored in a pointer to a 32-bit integer.
Therefore pointer get truncated.

gcc is tries to warn about this:

bbrun.c: In function ‘readHistory’:
bbrun.c:202:19: warning: cast from pointer to integer of different size 
[-Wpointer-to-int-cast]
       *histTOC2 = (u32) item;


coredumpctl gdb
(gdb) bt
#0  strlen () at ../sysdeps/x86_64/strlen.S:106
#1  0x00007f0d9be2ed78 in _IO_vfprintf_internal (s=0x55586cdd4d20, 
format=<optimized out>, ap=ap@entry=0x7ffca6fb9568) at vfprintf.c:1637
#2  0x00007f0d9be35157 in __fprintf (stream=<optimized out>, format=<optimized 
out>) at fprintf.c:32
#3  0x000055586bcc0cdf in writeHistory () at bbrun.c:312
#4  0x000055586bcc0f36 in execDialogInformation () at bbrun.c:346
#5  0x000055586bcc1063 in callback (widget=<optimized out>, data=<optimized 
out>) at bbrun.c:326
#6  0x00007f0d9c994f75 in g_closure_invoke () from 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
...

(gdb) frame 3
#3  0x000055586bcc0cdf in writeHistory () at bbrun.c:312
312         fprintf(fp, "%s\n", (char *) *histTOC2);

(gdb) print histTOC2
$1 = (u_int32_t *) 0x55586ccd7e50
(gdb) print/x *histTOC2
$3 = 0x6cdd4c10



Attached dpatch tries to use proper pointer types avoiding casts.

Kind regards,
Bernhard
#! /bin/sh /usr/share/dpatch/dpatch-run
##
## All lines beginning with `## DP:' are a description of the patch.
##
##From 62373247b1a4cc58d9066bb976bff8df96ae0a73 Mon Sep 17 00:00:00 2001
##From: =?UTF-8?q?Bernhard=20=C3=9Cbelacker?= <bernha...@mailbox.org>
##Date: Fri, 5 May 2017 23:01:38 +0200
##Subject: Use pointer type instead of 32bit integer to store history.
##
##https://bugs.debian.org/860443
##---
## bbrun/bbrun.c | 21 ++++++++++-----------
## 1 file changed, 10 insertions(+), 11 deletions(-)

@DPATCH@
diff --git a/bbrun/bbrun.c b/bbrun/bbrun.c
index 46bf6c3..a52026e 100644
--- a/bbrun/bbrun.c
+++ b/bbrun/bbrun.c
@@ -20,7 +20,6 @@
 #define ADVANCED_WINDOW_ROWS 3
 #define ADVANCED_WINDOW_COLS 10
 
-#define u32 u_int32_t
 #define __DEBUG__ 0
 #define VERSION "1.6"
 
@@ -38,8 +37,8 @@ char historyFilename[MAXPATHLEN + 1];    // The path to the 
history file, +1 is
 
 // TOC = Table Of Contents, it is a dynamically allocated array of pointers to 
dynamically
 // allocated history items. 
-u32 *histTOC;                           // Always keep track of the beginning, 
this one is NEVER incremented.
-u32 *histTOC2;                          // We increment this one for each item
+char* *histTOC;                                 // Always keep track of the 
beginning, this one is NEVER incremented.
+char* *histTOC2;                                // We increment this one for 
each item
 
 void parseArguments(int, char **);
 void execDialogInformation();
@@ -170,7 +169,7 @@ void readHistory(void) {
   char *item;
   FILE *fp;
 
-  histTOC = malloc(sizeof(u32) * 1);
+  histTOC = malloc(sizeof(*histTOC) * 1);
   histTOC2 = histTOC;
 
   if ((fp = fopen(historyFilename, "r")) == 0) {
@@ -192,14 +191,14 @@ void readHistory(void) {
     if (buf != NULL) {
       historyLength++;
 
-      histTOC = realloc(histTOC, sizeof(u32) * historyLength);
+      histTOC = realloc(histTOC, sizeof(*histTOC) * historyLength);
       histTOC2 = histTOC + historyLength - 1;
 
       item = malloc(strlen(buf));
       strncpy(item, buf, strlen(buf));
       item[strlen(buf)- 1] = 0x0;                      // Remove the newline 
char
 
-      *histTOC2 = (u32) item;
+      *histTOC2 = item;
     } else {
       // sc...@furt.com, This is a NULL line, which should NEVER happen.  Stop 
any further processing, 
       // because chances are very good that the rest of the file is corrupt 
too.
@@ -232,7 +231,7 @@ void updateHistory(char *newHistoryItem)
   int duplicate = -1;
   int historyIndex;
   char *item;
-  u32 *histTransit;            // Before, we would copy the data around, now 
we play around
+  char *histTransit;           // Before, we would copy the data around, now 
we play around
                                // with the pointers, which should be more 
efficient. 
 
   if (__DEBUG__)
@@ -256,7 +255,7 @@ void updateHistory(char *newHistoryItem)
       fprintf(stderr, " duplicate of item [%02d].\n", duplicate);
 
     if (duplicate != (historyLength - 1)) {    // If the duplicate entry is 
not at the end 
-      histTransit = (u32 *) (histTOC + duplicate);
+      histTransit = *(histTOC + duplicate);
 
       // Shift each entry forward
       for (historyIndex = duplicate; historyIndex < historyLength - 1; 
historyIndex++) {
@@ -266,7 +265,7 @@ void updateHistory(char *newHistoryItem)
 
       // put duplicate at the end
       histTOC2 = histTOC + historyLength - 1;
-      *histTOC2 = (u32) histTransit; 
+      *histTOC2 = histTransit;
     }
   } else {
     // The command is NOT in the history already, so add it
@@ -276,14 +275,14 @@ void updateHistory(char *newHistoryItem)
     historyLength++;
 
     // Set the last item of the history to be the new command
-    histTOC = realloc(histTOC, sizeof(u32) * historyLength);
+    histTOC = realloc(histTOC, sizeof(*histTOC) * historyLength);
     histTOC2 = histTOC + historyLength - 1;
 
     item = malloc(MAXCMDLEN + 1);
 
     strncpy(item, newHistoryItem, MAXCMDLEN + 1);
     item[strlen(item)] = 0x0;
-    *histTOC2 = (u32) item;
+    *histTOC2 = item;
   }
 
   if (__DEBUG__) {
-- 
2.11.0

Reply via email to