Bug#974828: printer-driver-hpcups: SIGABRT with "free(): invalid next size (normal)" in HPCupsFilter::cleanup
Dear Maintainer,
with the original PPD and input files from Ian I could
reproduce the issue and with the help of rr-debugger
this is what I assume what happens:
- The buffer m_pPrinterBuffer is allocated here with
the current sizes inside cups_header. [1]
- The first page got processed and for the second page
a new cups_header record gets copied. [2]
Unfortunately now the header contains higher sizes,
but the buffer is not grown accordingly.
- Now to this buffer is written by a read function, and beyond
where the management information of malloc got overwritten for
some other random memory. [3]
- The defect in the management information of malloc is detected
and the process is aborted. [4]
The attached patch is an attempt to grow the buffer size
if the header changes on a new page.
This is just tested for the given crash, nothing more, therefore
there might be side effects on replacing this buffer?
Kind regards,
Bernhard
[1]
500 m_pPrinterBuffer = new BYTE[cups_header->cupsWidth * 4 + 32];
(rr) bt
#0 HPCupsFilter::startPage (this=0x556369c551c0 <filter>, cups_header=0x7ffe94b8e030) at prnt/hpcups/HPCupsFilter.cpp:500
#1 0x0000556369bf4793 in HPCupsFilter::processRasterData (this=this@entry=0x556369c551c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x55636ac39d00) at prnt/hpcups/HPCupsFilter.cpp:668
#2 0x0000556369bf4de9 in HPCupsFilter::StartPrintJob (this=0x556369c551c0 <filter>, argc=<optimized out>, argv=0x7ffe94b8ecf8) at prnt/hpcups/HPCupsFilter.cpp:597
...
(rr) when
Current event: 898
[2]
#0 0x00007f504dcaa190 in memcpy (__len=1796, __src=0x564615c8cd1c, __dest=0x7ffc2a13f080) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:34
#1 cupsRasterReadHeader2 (r=0x564615c8cd00, h=h@entry=0x7ffc2a13f080) at raster-stubs.c:209
#2 0x00005646141d356d in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:661
#3 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
#4 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#5 0x00005646141d0efa in _start ()
(rr) when
Current event: 1230
[3]
...
#9 0x00007f504dcaa00d in read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
#10 cups_read_fd (ctx=<optimized out>, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., bytes=19220) at raster-stubs.c:323
#11 0x00007f504dca9340 in cups_raster_io (bytes=19220, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., r=0x564615c8cd00) at raster-stream.c:1372
#12 _cupsRasterReadPixels (r=0x564615c8cd00, p=0x564615cb1ca0 '\377' <repeats 200 times>..., len=19220) at raster-stream.c:782
#13 0x00007f504dcaa1e5 in cupsRasterReadPixels (r=<optimized out>, p=<optimized out>, len=<optimized out>) at raster-stubs.c:228
#14 0x00005646141d36e8 in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:758
#15 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
...
[4]
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007f504d83e537 in __GI_abort () at abort.c:79
#2 0x00007f504d897768 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f504d9a5e31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007f504d89ea5a in malloc_printerr (str=str@entry=0x7f504d9a8258 "free(): invalid next size (normal)") at malloc.c:5347
#4 0x00007f504d89ff2c in _int_free (av=0x7f504d9d7b80 <main_arena>, p=0x564615cb1c90, have_lock=<optimized out>) at malloc.c:4322
#5 0x00005646141d15c6 in HPCupsFilter::cleanup (this=this@entry=0x5646142341c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:227
#6 0x00005646141d3e1b in HPCupsFilter::closeFilter (this=0x5646142341c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:221
#7 HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:617
...
Description: Grow m_pPrinterBuffer if needed on each page
Author: Bernhard Übelacker <bernhardu@mailbox.org>
Bug-Debian: https://bugs.debian.org/974828
Bug-Ubuntu: https://launchpad.net/bugs/1904318
Last-Update: 2021-02-26
Index: hplip-3.20.11+dfsg0/prnt/hpcups/HPCupsFilter.cpp
===================================================================
--- hplip-3.20.11+dfsg0.orig/prnt/hpcups/HPCupsFilter.cpp
+++ hplip-3.20.11+dfsg0/prnt/hpcups/HPCupsFilter.cpp
@@ -199,7 +199,7 @@ void HPCupsFilter::WriteKBMPRaster (FILE
fwrite (black_raster, 1, adj_k_width, fp);
}
-HPCupsFilter::HPCupsFilter() : m_pPrinterBuffer(NULL)
+HPCupsFilter::HPCupsFilter() : m_pPrinterBuffer(NULL), m_PrinterBufferSize(0)
{
setbuf (stderr, NULL);
@@ -226,6 +226,7 @@ void HPCupsFilter::cleanup()
if (m_pPrinterBuffer) {
delete [] m_pPrinterBuffer;
m_pPrinterBuffer = NULL;
+ m_PrinterBufferSize = 0;
}
if(m_ppd){
@@ -497,8 +498,6 @@ DRIVER_ERROR HPCupsFilter::startPage (cu
dbglog("HPCUPS: returning NO_ERROR from startPage\n");
}
- m_pPrinterBuffer = new BYTE[cups_header->cupsWidth * 4 + 32];
-
return NO_ERROR;
}
@@ -663,6 +662,14 @@ int HPCupsFilter::processRasterData(cups
current_page_number++;
+ if (m_PrinterBufferSize < (cups_header.cupsWidth * 4 + 32)) {
+ m_PrinterBufferSize = cups_header.cupsWidth * 4 + 32;
+ if (m_pPrinterBuffer) {
+ delete [] m_pPrinterBuffer;
+ }
+ m_pPrinterBuffer = new BYTE[m_PrinterBufferSize];
+ }
+
if (current_page_number == 1) {
if (startPage(&cups_header) != NO_ERROR) {
Index: hplip-3.20.11+dfsg0/prnt/hpcups/HPCupsFilter.h
===================================================================
--- hplip-3.20.11+dfsg0.orig/prnt/hpcups/HPCupsFilter.h
+++ hplip-3.20.11+dfsg0/prnt/hpcups/HPCupsFilter.h
@@ -89,6 +89,7 @@ public:
private:
BYTE *m_pPrinterBuffer;
+ int m_PrinterBufferSize;
Job m_Job;
SystemServices *m_pSys;
int child_pid;
# Bullseye/testing amd64 qemu VM 2021-02-25
apt update
apt dist-upgrade
apt install systemd-coredump mc quilt fakeroot gdb valgrind rr git cups hplip hplip-dbgsym printer-driver-hpcups-dbgsym libcups2-dbgsym
apt build-dep glibc
apt build-dep hplip
mkdir /home/benutzer/source/glibc/orig -p
cd /home/benutzer/source/glibc/orig
apt source glibc
cd
mkdir /home/benutzer/source/cups/orig -p
cd /home/benutzer/source/cups/orig
apt source cups
cd
mkdir /home/benutzer/source/hplip/orig -p
cd /home/benutzer/source/hplip/orig
apt source hplip
cd
mkdir 974828
cd 974828
wget "https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=974828;filename=974828.tar.gz;msg=38" -O 974828.tar.gz
tar -zxf 974828.tar.gz
export PPD=/home/benutzer/974828/HP_Officejet_Pro_8610.ppd
/usr/lib/cups/filter/pdftopdf 1 debian '' 1 '' <1605427739.pdf >my_print_step_1.pdf
/usr/lib/cups/filter/gstoraster 1 debian '' 1 '' <my_print_step_1.pdf >my_print_step_2.raster
/usr/lib/cups/filter/hpcups 1 debian '' 1 '' <my_print_step_2.raster >my_print_step_3.hpcups
benutzer@debian:~/974828$ /usr/lib/cups/filter/hpcups 1 debian '' 1 '' <my_print_step_2.raster >my_print_step_3.hpcups
STATE: -marker-supply-low-warning
PAGE: 1 1
PAGE: 2 1
free(): invalid next size (normal)
Abgebrochen (Speicherabzug geschrieben)
root@debian:~# coredumpctl list
TIME PID UID GID SIG COREFILE EXE
Fri 2021-02-26 05:48:46 CET 4520 1000 1000 6 present /usr/lib/cups/filter/hpcups
root@debian:~# coredumpctl gdb 4520
PID: 4520 (hpcups)
UID: 1000 (benutzer)
GID: 1000 (benutzer)
Signal: 6 (ABRT)
Timestamp: Fri 2021-02-26 05:48:46 CET (2min 21s ago)
Command Line: /usr/lib/cups/filter/hpcups 1 debian 1
Executable: /usr/lib/cups/filter/hpcups
Control Group: /user.slice/user-1000.slice/session-3.scope
Unit: session-3.scope
Slice: user-1000.slice
Session: 3
Owner UID: 1000 (benutzer)
Boot ID: bbc7b40a5b0549bc8f275b755e0fc7b7
Machine ID: 33f18f39d2a9438eb75b0ed52848afcd
Hostname: debian
Storage: /var/lib/systemd/coredump/core.hpcups.1000.bbc7b40a5b0549bc8f275b755e0fc7b7.4520.1614314926000000.zst
Message: Process 4520 (hpcups) of user 1000 dumped core.
Stack trace of thread 4520:
#0 0x00007f530d66ace1 raise (libc.so.6 + 0x3bce1)
#1 0x00007f530d654537 abort (libc.so.6 + 0x25537)
#2 0x00007f530d6ad768 n/a (libc.so.6 + 0x7e768)
#3 0x00007f530d6b4a5a n/a (libc.so.6 + 0x85a5a)
#4 0x00007f530d6b5f2c n/a (libc.so.6 + 0x86f2c)
#5 0x000055c2847f55c6 n/a (hpcups + 0x85c6)
#6 0x000055c2847f7e1b n/a (hpcups + 0xae1b)
#7 0x00007f530d655d0a __libc_start_main (libc.so.6 + 0x26d0a)
#8 0x000055c2847f4efa n/a (hpcups + 0x7efa)
...
Core was generated by `/usr/lib/cups/filter/hpcups 1 debian 1 '.
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: Datei oder Verzeichnis nicht gefunden.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007f530d654537 in __GI_abort () at abort.c:79
#2 0x00007f530d6ad768 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f530d7bbe31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007f530d6b4a5a in malloc_printerr (str=str@entry=0x7f530d7be258 "free(): invalid next size (normal)") at malloc.c:5347
#4 0x00007f530d6b5f2c in _int_free (av=0x7f530d7edb80 <main_arena>, p=0x55c284b3f840, have_lock=<optimized out>) at malloc.c:4322
#5 0x000055c2847f55c6 in ?? ()
#6 0x000055c2847f7e1b in ?? ()
#7 0x00007f530d655d0a in __libc_start_main (main=0x55c2847f4e10, argc=6, argv=0x7ffd61e19d78, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd61e19d68) at ../csu/libc-start.c:308
#8 0x000055c2847f4efa in ?? ()
(gdb)
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007f530d654537 in __GI_abort () at abort.c:79
#2 0x00007f530d6ad768 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f530d7bbe31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007f530d6b4a5a in malloc_printerr (str=str@entry=0x7f530d7be258 "free(): invalid next size (normal)") at malloc.c:5347
#4 0x00007f530d6b5f2c in _int_free (av=0x7f530d7edb80 <main_arena>, p=0x55c284b3f840, have_lock=<optimized out>) at malloc.c:4322
#5 0x000055c2847f55c6 in HPCupsFilter::cleanup (this=this@entry=0x55c2848581c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:227
#6 0x000055c2847f7e1b in HPCupsFilter::closeFilter (this=0x55c2848581c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:221
#7 HPCupsFilter::StartPrintJob (this=0x55c2848581c0 <filter>, argc=<optimized out>, argv=0x7ffd61e19d78) at prnt/hpcups/HPCupsFilter.cpp:617
#8 0x00007f530d655d0a in __libc_start_main (main=0x55c2847f4e10 <main(int, char**)>, argc=6, argv=0x7ffd61e19d78, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd61e19d68) at ../csu/libc-start.c:308
#9 0x000055c2847f4efa in _start ()
benutzer@debian:~/974828$ valgrind /usr/lib/cups/filter/hpcups 1 debian '' 1 '' <my_print_step_2.raster >my_print_step_3.hpcups
==84343== Memcheck, a memory error detector
==84343== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==84343== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==84343== Command: /usr/lib/cups/filter/hpcups 1 debian 1
==84343==
STATE: -marker-supply-low-warning
PAGE: 1 1
PAGE: 2 1
==84343== Syscall param read(buf) points to unaddressable byte(s)
==84343== at 0x49F404E: read (read.c:26)
==84343== by 0x492000C: UnknownInlinedFun (unistd.h:44)
==84343== by 0x492000C: cups_read_fd (raster-stubs.c:323)
==84343== by 0x491F33F: cups_raster_io (raster-stream.c:1372)
==84343== by 0x491F33F: _cupsRasterReadPixels (raster-stream.c:782)
==84343== by 0x1126E7: HPCupsFilter::processRasterData(_cups_raster_s*) (HPCupsFilter.cpp:758)
==84343== by 0x112DE8: HPCupsFilter::StartPrintJob(int, char**) (HPCupsFilter.cpp:597)
==84343== by 0x4C18D09: (below main) (libc-start.c:308)
==84343== Address 0x5af9bd4 is 0 bytes after a block of size 11,140 alloc'd
==84343== at 0x483950F: operator new[](unsigned long) (vg_replace_malloc.c:431)
==84343== by 0x111BE8: HPCupsFilter::startPage(cups_page_header2_s*) (HPCupsFilter.cpp:500)
==84343== by 0x112792: HPCupsFilter::processRasterData(_cups_raster_s*) (HPCupsFilter.cpp:668)
==84343== by 0x112DE8: HPCupsFilter::StartPrintJob(int, char**) (HPCupsFilter.cpp:597)
==84343== by 0x4C18D09: (below main) (libc-start.c:308)
==84343==
==84343==
==84343== HEAP SUMMARY:
==84343== in use at exit: 18,040 bytes in 5 blocks
==84343== total heap usage: 2,179 allocs, 2,174 frees, 938,220 bytes allocated
==84343==
==84343== LEAK SUMMARY:
==84343== definitely lost: 11,108 bytes in 2 blocks
==84343== indirectly lost: 0 bytes in 0 blocks
==84343== possibly lost: 0 bytes in 0 blocks
==84343== still reachable: 6,932 bytes in 3 blocks
==84343== suppressed: 0 bytes in 0 blocks
==84343== Rerun with --leak-check=full to see details of leaked memory
==84343==
==84343== For lists of detected and suppressed errors, rerun with: -s
==84343== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
echo 1 > /proc/sys/kernel/perf_event_paranoid
benutzer@debian:~/974828$ rr record /usr/lib/cups/filter/hpcups 1 debian '' 1 '' <my_print_step_2.raster >my_print_step_3.hpcups
STATE: -marker-supply-low-warning
PAGE: 1 1
PAGE: 2 1
free(): invalid next size (normal)
Abgebrochen
benutzer@debian:~/974828$ rr ls
cpu_lock
hpcups-0
latest-trace
benutzer@debian:~/974828$ rr ps hpcups-0
PID PPID EXIT CMD
4928 -- -6 /usr/lib/cups/filter/hpcups 1 debian 1
benutzer@debian:~/974828$ rr replay hpcups-0
directory /home/benutzer/source/glibc/orig/glibc-2.31/malloc
directory /home/benutzer/source/cups/orig/cups-2.3.3op2/cups
directory /home/benutzer/source/hplip/orig/hplip-3.20.11+dfsg0/prnt/hpcups
set width 0
set pagination off
display/i $pc
cont
bt
reverse-finish
12345Xfree(): invalid next size (normal)
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: Datei oder Verzeichnis nicht gefunden.
(rr) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007f504d83e537 in __GI_abort () at abort.c:79
#2 0x00007f504d897768 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f504d9a5e31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007f504d89ea5a in malloc_printerr (str=str@entry=0x7f504d9a8258 "free(): invalid next size (normal)") at malloc.c:5347
#4 0x00007f504d89ff2c in _int_free (av=0x7f504d9d7b80 <main_arena>, p=0x564615cb1c90, have_lock=<optimized out>) at malloc.c:4322
#5 0x00005646141d15c6 in HPCupsFilter::cleanup (this=this@entry=0x5646142341c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:227
#6 0x00005646141d3e1b in HPCupsFilter::closeFilter (this=0x5646142341c0 <filter>) at prnt/hpcups/HPCupsFilter.cpp:221
#7 HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:617
#8 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#9 0x00005646141d0efa in _start ()
(rr) when
Current event: 1744
(rr) reverse-finish
Run back to call of #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 return ret;
1: x/i $pc
=> 0x7f504d854ce1 <__GI_raise+321>: mov 0x108(%rsp),%rax
(rr) reverse-finish
Run back to call of #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
0x00007f504d83e532 in __GI_abort () at abort.c:79
79 abort.c: Datei oder Verzeichnis nicht gefunden.
1: x/i $pc
=> 0x7f504d83e532 <__GI_abort+286>: call 0x7f504d854ba0 <__GI_raise>
(rr) reverse-finish
Run back to call of #0 0x00007f504d83e532 in __GI_abort () at abort.c:79
__libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f504d9a5e31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
155 abort ();
1: x/i $pc
=> 0x7f504d897763 <__libc_message+595>: call 0x7f504d83e414 <__GI_abort>
(rr) reverse-finish
Run back to call of #0 __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f504d9a5e31 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
0x00007f504d89ea55 in malloc_printerr (str=str@entry=0x7f504d9a8258 "free(): invalid next size (normal)") at malloc.c:5347
5347 __libc_message (do_abort, "%s\n", str);
1: x/i $pc
=> 0x7f504d89ea55 <malloc_printerr+21>: call 0x7f504d897510 <__libc_message>
(rr) reverse-finish
Run back to call of #0 0x00007f504d89ea55 in malloc_printerr (str=str@entry=0x7f504d9a8258 "free(): invalid next size (normal)") at malloc.c:5347
0x00007f504d89ff27 in _int_free (av=0x7f504d9d7b80 <main_arena>, p=0x564615cb1c90, have_lock=<optimized out>) at malloc.c:4322
4322 malloc_printerr ("free(): invalid next size (normal)");
1: x/i $pc
=> 0x7f504d89ff27 <_int_free+1543>: call 0x7f504d89ea40 <malloc_printerr>
(rr) list
4317 malloc_printerr ("double free or corruption (!prev)");
4318
4319 nextsize = chunksize(nextchunk);
4320 if (__builtin_expect (chunksize_nomask (nextchunk) <= 2 * SIZE_SZ, 0)
4321 || __builtin_expect (nextsize >= av->system_mem, 0))
4322 malloc_printerr ("free(): invalid next size (normal)");
4323
4324 free_perturb (chunk2mem(p), size - 2 * SIZE_SZ);
4325
4326 /* consolidate backward */
(rr) print nextchunk
$1 = (mchunkptr) 0x564615cb4820
(rr) print/x nextsize
$2 = 0xfffffffffffffff8
(rr) print av->system_mem
$3 = 454656
(rr) print/x av->system_mem
$4 = 0x6f000
(rr) display nextsize
2: nextsize = 18446744073709551608
(rr) undisp 2
(rr) display/x nextsize
3: /x nextsize = 0xfffffffffffffff8
(rr) reverse-stepi
4322 malloc_printerr ("free(): invalid next size (normal)");
1: x/i $pc
=> 0x7f504d89ff20 <_int_free+1536>: lea 0x108331(%rip),%rdi # 0x7f504d9a8258
3: /x nextsize = 0xfffffffffffffff8
(rr)
0x00007f504d89fadd 4321 || __builtin_expect (nextsize >= av->system_mem, 0))
1: x/i $pc
=> 0x7f504d89fadd <_int_free+445>: jbe 0x7f504d89ff20 <_int_free+1536>
3: /x nextsize = 0xfffffffffffffff8
(rr)
0x00007f504d89fad6 4321 || __builtin_expect (nextsize >= av->system_mem, 0))
1: x/i $pc
=> 0x7f504d89fad6 <_int_free+438>: cmp %r14,0x888(%rbp)
3: /x nextsize = 0xfffffffffffffff8
(rr)
0x00007f504d89fad0 4320 if (__builtin_expect (chunksize_nomask (nextchunk) <= 2 * SIZE_SZ, 0)
1: x/i $pc
=> 0x7f504d89fad0 <_int_free+432>: jbe 0x7f504d89ff20 <_int_free+1536>
3: /x nextsize = 0xfffffffffffffff8
(rr)
4320 if (__builtin_expect (chunksize_nomask (nextchunk) <= 2 * SIZE_SZ, 0)
1: x/i $pc
=> 0x7f504d89facc <_int_free+428>: cmp $0x10,%rax
3: /x nextsize = 0xfffffffffffffff8
(rr) info reg
rax 0xffffffffffffffff -1
rbx 0x2b90 11152
rcx 0x564615c5c010 94859012980752
rdx 0x13c50 80976
rsi 0x564615cb1c90 94859013332112
rdi 0x7f504d9d7b80 139982876277632
rbp 0x7f504d9d7b80 0x7f504d9d7b80 <main_arena>
rsp 0x7ffc2a13fb40 0x7ffc2a13fb40
r8 0x0 0
r9 0x5 5
r10 0x7f504ddb6110 139982880334096
r11 0x7f504d8a3720 139982875014944
r12 0x564615cb1c90 94859013332112
r13 0x564615cb4820 94859013343264
r14 0xfffffffffffffff8 -8
r15 0x5646142348b0 94858985556144
rip 0x7f504d89facc 0x7f504d89facc <_int_free+428>
eflags 0x282 [ SF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
fs_base 0x7f504cbe0400 0x7f504cbe0400
gs_base 0x0 0x0
(rr) reverse-stepi
0x00007f504d89fac8 4319 nextsize = chunksize(nextchunk);
1: x/i $pc
=> 0x7f504d89fac8 <_int_free+424>: and $0xfffffffffffffff8,%r14
3: /x nextsize = <optimized out>
(rr) display/x $r14
4: /x $r14 = 0xffffffffffffffff
(rr) reverse-stepi
4319 nextsize = chunksize(nextchunk);
1: x/i $pc
=> 0x7f504d89fac5 <_int_free+421>: mov %rax,%r14
3: /x nextsize = <optimized out>
4: /x $r14 = 0x0
(rr) undisp 4
(rr) display/x $rax
5: /x $rax = 0xffffffffffffffff
(rr) reverse-stepi
0x00007f504d89fabf 4316 if (__glibc_unlikely (!prev_inuse(nextchunk)))
1: x/i $pc
=> 0x7f504d89fabf <_int_free+415>: je 0x7f504d8a0090 <_int_free+1904>
3: /x nextsize = <optimized out>
5: /x $rax = 0xffffffffffffffff
(rr)
0x00007f504d89fabd 4316 if (__glibc_unlikely (!prev_inuse(nextchunk)))
1: x/i $pc
=> 0x7f504d89fabd <_int_free+413>: test $0x1,%al
3: /x nextsize = <optimized out>
5: /x $rax = 0xffffffffffffffff
(rr)
4316 if (__glibc_unlikely (!prev_inuse(nextchunk)))
1: x/i $pc
=> 0x7f504d89fab9 <_int_free+409>: mov 0x8(%r13),%rax
3: /x nextsize = <optimized out>
5: /x $rax = 0x564615ccb000
(rr) undisp 5
(rr) x/1xg $r13 + 0x8
0x564615cb4828: 0xffffffffffffffff
(rr) watch *0x564615cb4828
Hardware watchpoint 1: *0x564615cb4828
(rr) reverse-cont
Continuing.
Hardware watchpoint 1: *0x564615cb4828
Old value = -1
New value = 16777215
0x00007f504dd88d43 in local_memcpy (n=19220, source=0x7f504cadd02e, dest=0x564615cb1ca0) at ./src/preload/syscallbuf.c:194
194 ./src/preload/syscallbuf.c: Datei oder Verzeichnis nicht gefunden.
1: x/i $pc
=> 0x7f504dd88d43 <sys_read+387>: rep movsb %ds:(%rsi),%es:(%rdi)
(rr) bt
#0 0x00007f504dd88d43 in local_memcpy (n=19220, source=0x7f504cadd02e, dest=0x564615cb1ca0) at ./src/preload/syscallbuf.c:194
#1 copy_output_buffer (buf2=0x7f504cadd02e, buf=0x564615cb1ca0, ptr=0x7f504cae1b42, ret_size=19220) at ./src/preload/syscallbuf.c:1135
#2 sys_read (call=call@entry=0x681fffa0) at ./src/preload/syscallbuf.c:2281
#3 0x00007f504dd89fd2 in syscall_hook_internal (call=0x681fffa0) at ./src/preload/syscallbuf.c:3223
#4 syscall_hook (call=0x681fffa0) at ./src/preload/syscallbuf.c:3329
#5 0x00007f504dd86270 in _syscall_hook_trampoline () at /build/rr-7fqooc/rr-5.4.0/src/preload/syscall_hook.S:313
#6 0x00007f504dd862cf in __morestack () at /build/rr-7fqooc/rr-5.4.0/src/preload/syscall_hook.S:458
#7 0x00007f504dd862ea in _syscall_hook_trampoline_48_3d_00_f0_ff_ff () at /build/rr-7fqooc/rr-5.4.0/src/preload/syscall_hook.S:469
#8 0x00007f504dbe0054 in __libc_read (fd=fd@entry=0, buf=buf@entry=0x564615cb1ca0, nbytes=nbytes@entry=19220) at ../sysdeps/unix/sysv/linux/read.c:26
#9 0x00007f504dcaa00d in read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
#10 cups_read_fd (ctx=<optimized out>, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., bytes=19220) at raster-stubs.c:323
#11 0x00007f504dca9340 in cups_raster_io (bytes=19220, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., r=0x564615c8cd00) at raster-stream.c:1372
#12 _cupsRasterReadPixels (r=0x564615c8cd00, p=0x564615cb1ca0 '\377' <repeats 200 times>..., len=19220) at raster-stream.c:782
#13 0x00007f504dcaa1e5 in cupsRasterReadPixels (r=<optimized out>, p=<optimized out>, len=<optimized out>) at raster-stubs.c:228
#14 0x00005646141d36e8 in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:758
#15 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
#16 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#17 0x00005646141d0efa in _start ()
(rr) when
Current event: 1235
(rr) b read
Breakpoint 2 at 0x7f504d907e80: read. (5 locations)
(rr) disa 1
(rr) reverse-cont
Continuing.
Breakpoint 2, __libc_read (fd=fd@entry=0, buf=buf@entry=0x564615cb1ca0, nbytes=nbytes@entry=19220) at ../sysdeps/unix/sysv/linux/read.c:26
26 return SYSCALL_CANCEL (read, fd, buf, nbytes);
1: x/i $pc
=> 0x7f504dbe0040 <__libc_read>: mov %fs:0x18,%eax
(rr) reverse-finish
Run back to call of #0 __libc_read (fd=fd@entry=0, buf=buf@entry=0x564615cb1ca0, nbytes=nbytes@entry=19220) at ../sysdeps/unix/sysv/linux/read.c:26
0x00007f504dcaa008 in read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
44 return __read_alias (__fd, __buf, __nbytes);
1: x/i $pc
=> 0x7f504dcaa008 <cups_read_fd+24>: call 0x7f504dc7d740 <read@plt>
(rr)
Run till exit from #0 0x00007f504dcaa008 in read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
Breakpoint 2, read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
44 return __read_alias (__fd, __buf, __nbytes);
1: x/i $pc
=> 0x7f504dcaa000 <cups_read_fd+16>: mov %rbp,%rdx
(rr) reverse-finish
Run till exit from #0 read (__nbytes=19220, __buf=0x564615cb1ca0, __fd=0) at /usr/include/x86_64-linux-gnu/bits/unistd.h:44
cups_read_fd (ctx=<optimized out>, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., bytes=19220) at raster-stubs.c:323
323 while ((count = read(fd, buf, bytes)) < 0)
1: x/i $pc
=> 0x7f504dca9ffc <cups_read_fd+12>: nopl 0x0(%rax)
(rr) bt
#0 cups_read_fd (ctx=<optimized out>, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., bytes=19220) at raster-stubs.c:323
#1 0x00007f504dca9340 in cups_raster_io (bytes=19220, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., r=0x564615c8cd00) at raster-stream.c:1372
#2 _cupsRasterReadPixels (r=0x564615c8cd00, p=0x564615cb1ca0 '\377' <repeats 200 times>..., len=19220) at raster-stream.c:782
#3 0x00007f504dcaa1e5 in cupsRasterReadPixels (r=<optimized out>, p=<optimized out>, len=<optimized out>) at raster-stubs.c:228
#4 0x00005646141d36e8 in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:758
#5 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
#6 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#7 0x00005646141d0efa in _start ()
(rr) when
Current event: 1235
(rr) up
#1 0x00007f504dca9340 in cups_raster_io (bytes=19220, buf=0x564615cb1ca0 '\377' <repeats 200 times>..., r=0x564615c8cd00) at raster-stream.c:1372
1372 count = (*r->iocb)(r->ctx, buf, bytes - (size_t)total);
(rr) print buf
$5 = (unsigned char *) 0x564615cb1ca0 '\377' <repeats 200 times>...
(rr) print bytes - (size_t)total
$6 = 19220
(rr) up
#2 _cupsRasterReadPixels (r=0x564615c8cd00, p=0x564615cb1ca0 '\377' <repeats 200 times>..., len=19220) at raster-stream.c:782
782 if (cups_raster_io(r, p, len) < (ssize_t)len)
(rr) print p
$7 = (unsigned char *) 0x564615cb1ca0 '\377' <repeats 200 times>...
(rr) print len
$8 = 19220
(rr) up
#3 0x00007f504dcaa1e5 in cupsRasterReadPixels (r=<optimized out>, p=<optimized out>, len=<optimized out>) at raster-stubs.c:228
228 return (_cupsRasterReadPixels(r, p, len));
(rr) print p
$9 = <optimized out>
(rr) print len
$10 = <optimized out>
(rr) up
#4 0x00005646141d36e8 in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:758
warning: Source file is more recent than executable.
758 cupsRasterReadPixels (cups_raster, m_pPrinterBuffer, cups_header.cupsBytesPerLine);
(rr) print m_pPrinterBuffer
$11 = (BYTE *) 0x564615cb1ca0 '\377' <repeats 200 times>...
(rr) print cups_header.cupsBytesPerLine
$12 = 19220
(rr) print &m_pPrinterBuffer
$13 = (BYTE **) 0x5646142341c0 <filter>
(rr) watch *0x5646142341c0
Hardware watchpoint 3: *0x5646142341c0
(rr) disa 2
(rr) reverse-cont
Continuing.
Hardware watchpoint 3: *0x5646142341c0
Old value = 365632672
New value = 0
0x00005646141d2be9 in HPCupsFilter::startPage (this=0x5646142341c0 <filter>, cups_header=0x7ffc2a13f080) at prnt/hpcups/HPCupsFilter.cpp:500
500 m_pPrinterBuffer = new BYTE[cups_header->cupsWidth * 4 + 32];
1: x/i $pc
=> 0x5646141d2be9 <_ZN12HPCupsFilter9startPageEP19cups_page_header2_s+2329>: mov %rax,(%rbx)
(rr) bt
#0 0x00005646141d2be9 in HPCupsFilter::startPage (this=0x5646142341c0 <filter>, cups_header=0x7ffc2a13f080) at prnt/hpcups/HPCupsFilter.cpp:500
#1 0x00005646141d3793 in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:668
#2 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
#3 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#4 0x00005646141d0efa in _start ()
(rr) when
Current event: 898
(rr) print cups_header->cupsWidth
$14 = 2777
(rr) print cups_header->cupsWidth * 4 + 32
$15 = 11140
(rr) print cups_header.cupsBytesPerLine
$16 = 11108
(rr) print &cups_header.cupsBytesPerLine
$17 = (unsigned int *) 0x7ffc2a13f208
--> At the time of allocation cupsBytesPerLine == 11108, but at time of read it is 19220
(rr) watch *0x7ffc2a13f208
Hardware watchpoint 4: *0x7ffc2a13f208
(rr) disa 3
(rr) cont
Hardware watchpoint 4: *0x7ffc2a13f208
Old value = 11108
New value = 19220
0x00007f504dcaa190 in memcpy (__len=1796, __src=0x564615c8cd1c, __dest=0x7ffc2a13f080) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:34
34 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
1: x/i $pc
=> 0x7f504dcaa190 <cupsRasterReadHeader2+80>: rep movsq %ds:(%rsi),%es:(%rdi)
(rr) bt
#0 0x00007f504dcaa190 in memcpy (__len=1796, __src=0x564615c8cd1c, __dest=0x7ffc2a13f080) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:34
#1 cupsRasterReadHeader2 (r=0x564615c8cd00, h=h@entry=0x7ffc2a13f080) at raster-stubs.c:209
#2 0x00005646141d356d in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:661
#3 0x00005646141d3de9 in HPCupsFilter::StartPrintJob (this=0x5646142341c0 <filter>, argc=<optimized out>, argv=0x7ffc2a13fd48) at prnt/hpcups/HPCupsFilter.cpp:597
#4 0x00007f504d83fd0a in __libc_start_main (main=0x5646141d0e10 <main(int, char**)>, argc=6, argv=0x7ffc2a13fd48, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc2a13fd38) at ../csu/libc-start.c:308
#5 0x00005646141d0efa in _start ()
(rr) when
Current event: 1230
(rr) disa 4
(rr) reverse-finish
Run till exit from #0 0x00007f504dcaa190 in memcpy (__len=1796, __src=0x564615c8cd1c, __dest=0x7ffc2a13f080) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:34
cupsRasterReadHeader2 (r=0x564615c8cd00, h=h@entry=0x7ffc2a13f080) at raster-stubs.c:209
209 memcpy(h, &(r->header), sizeof(cups_page_header2_t));
1: x/i $pc
=> 0x7f504dcaa182 <cupsRasterReadHeader2+66>: sub %rbx,%rsi
(rr) print h->cupsBytesPerLine
$20 = 11108
(rr) print h->cupsWidth
$21 = 2777
(rr) print r->header->cupsBytesPerLine
$22 = 19220
(rr) print r->header->cupsWidth
$23 = 4805
(rr) up
#1 0x00005646141d356d in HPCupsFilter::processRasterData (this=this@entry=0x5646142341c0 <filter>, cups_raster=<optimized out>, cups_raster@entry=0x564615c8cd00) at prnt/hpcups/HPCupsFilter.cpp:661
661 while (cupsRasterReadHeader2(cups_raster, &cups_header))
(rr) print m_pPrinterBuffer
$24 = (BYTE *) 0x564615cb1ca0 '\377' <repeats 200 times>...
dpkg-buildpackage
dpkg -i hplip_3.20.11+dfsg0-2_amd64.deb hplip-data_3.20.11+dfsg0-2_all.deb hplip-dbgsym_3.20.11+dfsg0-2_amd64.deb libhpmud0_3.20.11+dfsg0-2_amd64.deb libsane-hpaio_3.20.11+dfsg0-2_amd64.deb printer-driver-hpcups_3.20.11+dfsg0-2_amd64.deb printer-driver-hpcups-dbgsym_3.20.11+dfsg0-2_amd64.deb printer-driver-postscript-hp_3.20.11+dfsg0-2_amd64.deb
benutzer@debian:~/974828$ valgrind /usr/lib/cups/filter/hpcups 1 debian '' 1 '' <my_print_step_2.raster >my_print_step_3.hpcups
==123764== Memcheck, a memory error detector
==123764== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==123764== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==123764== Command: /usr/lib/cups/filter/hpcups 1 debian 1
==123764==
STATE: -marker-supply-low-warning
PAGE: 1 1
PAGE: 2 1
==123764==
==123764== HEAP SUMMARY:
==123764== in use at exit: 18,040 bytes in 5 blocks
==123764== total heap usage: 2,180 allocs, 2,175 frees, 957,472 bytes allocated
==123764==
==123764== LEAK SUMMARY:
==123764== definitely lost: 11,108 bytes in 2 blocks
==123764== indirectly lost: 0 bytes in 0 blocks
==123764== possibly lost: 0 bytes in 0 blocks
==123764== still reachable: 6,932 bytes in 3 blocks
==123764== suppressed: 0 bytes in 0 blocks
==123764== Rerun with --leak-check=full to see details of leaked memory
==123764==
==123764== For lists of detected and suppressed errors, rerun with: -s
==123764== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
benutzer@debian:~/974828$ ls -lisah
insgesamt 382M
786802 4,0K drwxr-xr-x 2 benutzer benutzer 4,0K 26. Feb 11:37 .
791941 4,0K drwxr-xr-x 8 benutzer benutzer 4,0K 26. Feb 14:42 ..
788374 224K -rw-r--r-- 1 benutzer benutzer 224K 25. Feb 19:17 1605427739.pdf
788287 1,4M -rw-r--r-- 1 benutzer benutzer 1,4M 26. Feb 11:36 974828.tar.gz
788373 28K -rw-r--r-- 1 benutzer benutzer 28K 25. Feb 19:25 HP_Officejet_Pro_8610.ppd
793120 224K -rw-r--r-- 1 benutzer benutzer 224K 26. Feb 11:37 my_print_step_1.pdf
793121 190M -rw-r--r-- 1 benutzer benutzer 190M 26. Feb 11:37 my_print_step_2.raster
793122 396K -rw-r--r-- 1 benutzer benutzer 394K 26. Feb 15:12 my_print_step_3.hpcups
788376 224K -rw-r--r-- 1 benutzer benutzer 224K 25. Feb 19:25 print_step_1.pdf
788377 190M -rw-r--r-- 1 benutzer benutzer 190M 25. Feb 19:25 print_step_2.raster
788390 396K -rw-r--r-- 1 benutzer benutzer 394K 25. Feb 19:25 print_step_3.hpcups
Reply to: