[Powertop] Device list sort function bug

Igor Zhbanov <i.zhbanov at samsung.com> Wed, 11 Jul 2012 10:11:16 +0400
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
Hello!

Sometimes PowerTOP dies with a Segmentation Fault while generating
the report. Little investigation shown that it dies while sorting
the device list. The problem is that comparison function devlist_sort
is incorrect.

The function should return true if first argument "preceeds" second.
But when strcmp() is used, it can return -1, 0 and 1. So both -1 and 1
values are silently converted to true, which is wrong. It confuses the sort()
function and it crosses boundary of array.

Here is the patch:
--8<--Cut-here----------------------------------------------------------------
diff -purN powertop-il/src/devlist.cpp powertop-il-fix/src/devlist.cpp
--- powertop-il/src/devlist.cpp	2012-07-03 17:00:50.000000000 +0400
+++ powertop-il-fix/src/devlist.cpp	2012-07-03 20:01:05.896232845 +0400
@@ -273,7 +273,7 @@ static bool devlist_sort(struct devuser
  	if (i->pid != j->pid)
  		return i->pid<  j->pid;

-	return strcmp(i->device, j->device);
+	return (strcmp(i->device, j->device)<  0);
  }

  static const char *dev_class(int line)
--8<--------------------------------------------------------------------------

Thank you.

-- 
Best regards,
Igor Zhbanov,
Expert Software Engineer,
phone: +7 (495) 797 25 00 ext 3806
e-mail: i.zhbanov(a)samsung.com

ASWG, Moscow R&D center, Samsung Electronics
12 Dvintsev street, building 1
127018, Moscow, Russian Federation
03-powertop-fix01.diff (text/x-diff, 453 B)
diff -purN powertop-il/src/devlist.cpp powertop-il-fix/src/devlist.cpp
--- powertop-il/src/devlist.cpp	2012-07-03 17:00:50.000000000 +0400
+++ powertop-il-fix/src/devlist.cpp	2012-07-03 20:01:05.896232845 +0400
@@ -273,7 +273,7 @@ static bool devlist_sort(struct devuser
 	if (i->pid != j->pid)
 		return i->pid < j->pid;
 
-	return strcmp(i->device, j->device);
+	return (strcmp(i->device, j->device) < 0);
 }
 
 static const char *dev_class(int line)