tinymix: Support more that 512 bytes in byte control

The set/get byte control support more than 512 bytes.
This is utilized by tlv type controls.

Signed-off-by: Samreen Nilofer <samreen.nilofer@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
(cherry picked from commit 7cab1ef96b60a7b16120cad230afb279329a01a1)
diff --git a/tinymix.c b/tinymix.c
index 68f9495..af18475 100644
--- a/tinymix.c
+++ b/tinymix.c
@@ -129,7 +129,7 @@
     unsigned int i;
     int min, max;
     int ret;
-    char buf[512] = { 0 };
+    char *buf = NULL;
     size_t len;
 
     if (isdigit(control[0]))
@@ -146,14 +146,18 @@
     num_values = mixer_ctl_get_num_values(ctl);
 
     if (type == MIXER_CTL_TYPE_BYTE) {
-        len = num_values;
-        if (len > sizeof(buf)) {
-            fprintf(stderr, "Truncating get to %zu bytes\n", sizeof(buf));
-            len = sizeof(buf);
+
+        buf = calloc(1, num_values);
+        if (buf == NULL) {
+            fprintf(stderr, "Failed to alloc mem for bytes %d\n", num_values);
+            return;
         }
+
+        len = num_values;
         ret = mixer_ctl_get_array(ctl, buf, len);
         if (ret < 0) {
             fprintf(stderr, "Failed to mixer_ctl_get_array\n");
+            free(buf);
             return;
         }
     }
@@ -189,6 +193,9 @@
             printf(" (range %d->%d)", min, max);
         }
     }
+
+    free(buf);
+
     printf("\n");
 }
 
@@ -196,14 +203,15 @@
     char **values, unsigned int num_values)
 {
     int ret;
-    char buf[512] = { 0 };
+    char *buf;
     char *end;
-    int i;
+    unsigned int i;
     long n;
 
-    if (num_values > sizeof(buf)) {
-        fprintf(stderr, "Truncating set to %zu bytes\n", sizeof(buf));
-        num_values = sizeof(buf);
+    buf = calloc(1, num_values);
+    if (buf == NULL) {
+        fprintf(stderr, "set_byte_ctl: Failed to alloc mem for bytes %d\n", num_values);
+        exit(EXIT_FAILURE);
     }
 
     for (i = 0; i < num_values; i++) {
@@ -211,17 +219,17 @@
         n = strtol(values[i], &end, 0);
         if (*end) {
             fprintf(stderr, "%s not an integer\n", values[i]);
-            exit(EXIT_FAILURE);
+            goto fail;
         }
         if (errno) {
             fprintf(stderr, "strtol: %s: %s\n", values[i],
                 strerror(errno));
-            exit(EXIT_FAILURE);
+            goto fail;
         }
         if (n < 0 || n > 0xff) {
             fprintf(stderr, "%s should be between [0, 0xff]\n",
                 values[i]);
-            exit(EXIT_FAILURE);
+            goto fail;
         }
         buf[i] = n;
     }
@@ -229,8 +237,15 @@
     ret = mixer_ctl_set_array(ctl, buf, num_values);
     if (ret < 0) {
         fprintf(stderr, "Failed to set binary control\n");
-        exit(EXIT_FAILURE);
+        goto fail;
     }
+
+    free(buf);
+    return;
+
+fail:
+    free(buf);
+    exit(EXIT_FAILURE);
 }
 
 static void tinymix_set_value(struct mixer *mixer, const char *control,