Hi,

the function "sort_criteria_comparision" contains plenty of bugs:

After upgrading my Noxon2 to the latest firmware it sends browsing
requests with sort-information but now the gmediaserver boosts up to
100% CPU.

Having a quick look at sort_criteria_comparision there are 3 bugs within
this few lines of code:

- sorting by more than one criteria does never work
- the while loop may never be left (that was here the case - 100% CPU)
- the function uses pointer comparision for sorting if
  everything else fails?

I've attached my current patch that does not really fix all the
problems but works for me.

Attached is a browsing request:

 <u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
  <ObjectID>0</ObjectID>
  <BrowseFlag>BrowseDirectChildren</BrowseFlag>
  <Filter>@childCount,dc:creator,upnp:album,upnp:artist,res,[EMAIL 
PROTECTED],[EMAIL PROTECTED],upnp:searchClass</Filter>
  <StartingIndex>0</StartingIndex>
  <RequestedCount>50</RequestedCount>
  <SortCriteria>+dc:title</SortCriteria>
  </u:Browse>

I didn't check why p1 and p2 are null, my quick guess is, that the plus sign
is not expected and so the attribute not found.

Cheers

Leif

--- src/contentdir.c.orig	2006-08-31 22:30:09.000000000 +0200
+++ src/contentdir.c	2007-03-25 18:10:10.000000000 +0200
@@ -145,8 +145,15 @@
     const Entry *e1 = k1;
     const Entry *e2 = k2;
 
+    if ( criteria->first == NULL ) {
+       /* default sorting */
+       return strcasecmp(e1->name, e2->name);
+    }
+
     sort_entry = criteria->first;
-    while (sort_entry != NULL) {
+
+    /* FIXME: sorting by multiple criterias will never work */
+    while (sort_entry != NULL) { /* FIXME: sort_entry is never updated! */
 	char *p1 = get_entry_property(e1, sort_entry->property);
 	char *p2 = get_entry_property(e2, sort_entry->property);
 
@@ -154,11 +161,11 @@
 	    free(p2);
 	    return (sort_entry->ascending ? -1 : 1);
 	}
-	if (p1 != NULL && p2 == NULL) {
+	else if (p1 != NULL && p2 == NULL) {
 	    free(p1);
 	    return (sort_entry->ascending ? 1 : -1);
 	}
-	if (p1 != NULL && p2 != NULL) {
+	else if (p1 != NULL && p2 != NULL) {
 	    int compare;
 
 	    compare = strcmp(p1, p2);
@@ -167,9 +174,12 @@
 	    if (compare != 0)
 		return (sort_entry->ascending ? compare : -compare);
 	}
+	else { /* both are null - bail out!!! */
+           return strcasecmp(e1->name, e2->name);
+        }
     }
 
-    return e1-e2;
+    return e1-e2; /* FIXME: sorting by pointer compare? */
 }
 
 void

Reply via email to