Citeren Pawel Sikora <[email protected]>:

(gdb) up
#1  blazer_status (cmd=<value optimized out>) at blazer.c:214

(gdb) p val
$1 = 0x0

Excellent, I missed checking for a NULL pointer somewhere in the code. Good catch!

199| for (i = 0, val = strtok_r(buf+1, " ", &last); status[i].var; i++, val = strtok_r(NULL, " \r\n", &last)) {
200|
201|                 if (!val) {
202|                         upsdebugx(2, "%s: parsing failed", __func__);
203|                         return -1;
204|                 }
205|
206|                 if (strspn(val, "0123456789.") != strlen(val)) {
207| upsdebugx(2, "%s: non numerical value [%s]", __func__, val);
208|                         continue;
209|                 }
210|
211| dstate_setinfo(status[i].var, status[i].fmt, status[i].conv(val, NULL));
212|         }

               if (!val) {
                       upsdebugx(2, "%s: parsing failed", __func__);
                       return -1;
               }

213|
214+-------> if (strspn(val, "01") != 8) {
215|                 upsdebugx(2, "Invalid status [%s]", val);
216|                 return -1;
217|         }

except this rare segfauls the nut-2.4.3 package is great and works fine.
i can provide more debugging details if needed.

Most likely this won't be needed. It is pretty obvious from the trace what is happening. The last chunk of data from the UPS (with the status information) is lost and the strspn() function receives NULL pointer indicating there is no more data). Try out the above modification and let us know if this fixes the segfaults.

Best regards, Arjen
--
Please keep list traffic on the list (off-list replies will be rejected)


_______________________________________________
Nut-upsdev mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/nut-upsdev

Reply via email to