batt: fix sigfpe: check that voltage_now != 0
authorHenry Gebhardt <hsggebhardt@gmail.com>
Mon, 5 Aug 2013 17:47:59 +0000 (13:47 -0400)
committerHenry Gebhardt <hsggebhardt@gmail.com>
Mon, 5 Aug 2013 17:47:59 +0000 (13:47 -0400)
gdb backtrace:
    Program received signal SIGFPE, Arithmetic exception.
    0x00007fffde2104c4 in battery_update (b=0x77be10) at batt_sys.c:193
    193     b->charge_full = b->energy_full * 1000 / b->voltage_now;
    (gdb) bt full
    #0  0x00007fffde2104c4 in battery_update (b=0x77be10) at batt_sys.c:193
     gctmp = 0xc58e60 "Battery"
    #1  0x00007fffde20eb37 in update_timout (lx_b=0x77db20) at batt.c:253
    No locals.
    #2  0x00007ffff6481e3b in ?? () from /usr/lib64/libglib-2.0.so.0
    No symbol table info available.
    #3  0x00007ffff67599a0 in ?? () from /usr/lib64/libglib-2.0.so.0
    No symbol table info available.
    #4  0x0000000000000001 in ?? ()
    No symbol table info available.
    #5  0x00000000006c8d40 in ?? ()
    No symbol table info available.
    #6  0x00007ffff64812b5 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
    No symbol table info available.
    #7  0x0000000000000002 in ?? ()
    No symbol table info available.
    #8  0x00007fffffffda70 in ?? ()
    No symbol table info available.
    #9  0x00007ffff6481e20 in ?? () from /usr/lib64/libglib-2.0.so.0
    No symbol table info available.
    #10 0x00000000f64810f2 in ?? ()
    No symbol table info available.
    #11 0x000000000077db20 in ?? ()
    No symbol table info available.
    #12 0x00007fffde20eacf in update_display (lx_b=0x18, repaint=0) at batt.c:244
     cr = 0x7fffffffda70
     tooltip = "$\305I\366\377\177\000\000@\240n", '\000' <repeats 13 times>, "\240\231u\366\377\177\000\000@;g\000\000\000\000\000\340\334w\000\000\000\000\000:\371I\366\377\177\000\000@;g\000\000\000\000\000\001\000\000\000\000\000\000\000\240\331\377\377\377\177\000\000\276\377 \336\377\177\000\000\252\r!\336\377\177\000\000\020\276w\000\000\000\000\000\360\336w\000\000\000\000\000`t\310\000\000\000\000\000@\240n\000\000\000\000\000\320[\310\000\000\000\000\000\300\331\377\377\377\177\000\000C\000!\336\377\177\000\000\252\r!\336\377\177\000\000\020\276w\000\000\000\000\000\360\331\377\377\377\177\000\000\367\003!\336\377\177\000\000\001\000\000\000\000\000\000\000\020\276w\000\000\000\000\000"...
     b = 0x7ffff6481e20
     rate = 0
     isCharging = 2
     chargeLevel = 32767
     __FUNCTION__ = "update_display"
    #13 0x000000000077def0 in ?? ()
    No symbol table info available.
    #14 0x0000000000000000 in ?? ()
    No symbol table info available.
    (gdb) print "%p" b
    A syntax error in expression, near `b'.
    (gdb) print "%p", b
    $1 = (battery *) 0x77be10
    (gdb) print "%lf", b->voltage_now
    $2 = 0
    (gdb) print "%f", b->voltage_now
    $3 = 0
    (gdb) print "%d", b->voltage_now
    $4 = 0

src/plugins/batt/batt_sys.c

index 5ee0cb9..3ce0433 100644 (file)
@@ -189,7 +189,7 @@ void battery_update(battery *b)
     /* convert energy values (in mWh) to charge values (in mAh) if needed and possible */
 
     if (b->energy_full != -1 && b->charge_full == -1) {
-       if (b->voltage_now != -1) {
+       if (b->voltage_now != -1 && b->voltage_now != 0) {
            b->charge_full = b->energy_full * 1000 / b->voltage_now;
        } else {
            b->charge_full = b->energy_full;
@@ -198,7 +198,7 @@ void battery_update(battery *b)
     }
 
     if (b->energy_full_design != -1 && b->charge_full_design == -1) {
-       if (b->voltage_now != -1) {
+       if (b->voltage_now != -1 && b->voltage_now != 0) {
            b->charge_full_design = b->energy_full_design * 1000 / b->voltage_now;
        } else {
            b->charge_full_design = b->energy_full_design;
@@ -207,7 +207,7 @@ void battery_update(battery *b)
     }
 
     if (b->energy_now != -1 && b->charge_now == -1) {
-       if (b->voltage_now != -1) {
+       if (b->voltage_now != -1 && b->voltage_now != 0) {
            b->charge_now = b->energy_now * 1000 / b->voltage_now;
            if (b->current_now != -1)
                b->current_now = b->current_now * 1000 / b->voltage_now;