sdcardfs: Truncate packages_gid.list on overflow
authorDaniel Rosenberg <drosen@google.com>
Fri, 8 Jul 2016 21:15:14 +0000 (14:15 -0700)
committerAmit Pundir <amit.pundir@linaro.org>
Mon, 11 Jul 2016 07:14:27 +0000 (12:44 +0530)
packages_gid.list was improperly returning the wrong
count. Use scnprintf instead, and inform the user that
the list was truncated if it is.

Bug: 30013843
Change-Id: Ida2b2ef7cd86dd87300bfb4c2cdb6bfe2ee1650d
Signed-off-by: Daniel Rosenberg <drosen@google.com>
fs/sdcardfs/packagelist.c

index 10f0d6be718bcd0b83da6f10d8f831e35f30aa89..9c3340528eee4e08971c19fc76ddd759f38cbf1c 100644 (file)
@@ -335,13 +335,20 @@ static ssize_t packages_attr_show(struct config_item *item,
        struct hashtable_entry *hash_cur;
        struct hlist_node *h_t;
        int i;
-       int count = 0;
+       int count = 0, written = 0;
+       char errormsg[] = "<truncated>\n";
+
        mutex_lock(&pkgl_data_all->hashtable_lock);
-       hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist)
-               count += snprintf(page + count, PAGE_SIZE - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value);
+       hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist) {
+               written = scnprintf(page + count, PAGE_SIZE - sizeof(errormsg) - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value);
+               if (count + written == PAGE_SIZE - sizeof(errormsg)) {
+                       count += scnprintf(page + count, PAGE_SIZE - count, errormsg);
+                       break;
+               }
+               count += written;
+       }
        mutex_unlock(&pkgl_data_all->hashtable_lock);
 
-
        return count;
 }