hal: Update to make code more reliable

Update to prevent the null pointer reference and re-align for
string operation.

Change-Id: Ic949aeeefb9fc113db826e273a89ecdf7d44c2da
CRs-fixed: 975118
diff --git a/hal/audio_extn/source_track.c b/hal/audio_extn/source_track.c
index bbe876b..c672ffd 100644
--- a/hal/audio_extn/source_track.c
+++ b/hal/audio_extn/source_track.c
@@ -260,6 +260,12 @@
     int ret = 0, err;
     char *kv_pairs = str_parms_to_str(parms);
 
+    if(kv_pairs == NULL) {
+        ret = -ENOMEM;
+        ALOGE("[%s] key-value pair is NULL",__func__);
+        goto done;
+    }
+
     ALOGV_IF(kv_pairs != NULL, "%s: enter: %s", __func__, kv_pairs);
 
     len = strlen(kv_pairs);
@@ -321,7 +327,8 @@
     }
 
 done:
-    free(kv_pairs);
+    if (kv_pairs)
+        free(kv_pairs);
     if(value != NULL)
         free(value);
     ALOGV("%s: returning bitmask = %d", __func__, ret);
@@ -441,8 +448,8 @@
             if ((i >=4) && (sound_focus_data.start_angle[i] == 0xFFFF))
                 continue;
             if (i)
-                snprintf(value + strlen(value), MAX_STR_SIZE, ",");
-            snprintf(value + strlen(value), MAX_STR_SIZE, "%d", sound_focus_data.start_angle[i]);
+                snprintf(value + strlen(value) - 1, MAX_STR_SIZE, ",");
+            snprintf(value + strlen(value) - 1, MAX_STR_SIZE, "%d", sound_focus_data.start_angle[i]);
         }
         str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SOUND_FOCUS_START_ANGLES, value);
     }
@@ -468,8 +475,8 @@
             if ((i >=4) && (source_tracking_data.vad[i] == 0xFF))
                 continue;
             if (i)
-                snprintf(value + strlen(value), MAX_STR_SIZE, ",");
-            snprintf(value + strlen(value), MAX_STR_SIZE, "%d", source_tracking_data.vad[i]);
+                snprintf(value + strlen(value) - 1, MAX_STR_SIZE, ",");
+            snprintf(value + strlen(value) - 1, MAX_STR_SIZE, "%d", source_tracking_data.vad[i]);
         }
         str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SOURCE_TRACK_VAD, value);
     }
@@ -488,8 +495,8 @@
     if (bitmask & BITMASK_AUDIO_PARAMETER_KEY_SOURCE_TRACK_POLAR_ACTIVITY) {
         for (i = 0; i < 360; i++) {
             if (i)
-                snprintf(value + strlen(value), MAX_STR_SIZE, ",");
-            snprintf(value + strlen(value), MAX_STR_SIZE, "%d", source_tracking_data.polar_activity[i]);
+                snprintf(value + strlen(value) - 1, MAX_STR_SIZE, ",");
+            snprintf(value + strlen(value) - 1, MAX_STR_SIZE, "%d", source_tracking_data.polar_activity[i]);
         }
         str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SOURCE_TRACK_POLAR_ACTIVITY, value);
     }
@@ -527,6 +534,12 @@
     char *value = NULL;
     char *kv_pairs = str_parms_to_str(parms);
 
+    if(kv_pairs == NULL) {
+        ret = -ENOMEM;
+        ALOGE("[%s] key-value pair is NULL",__func__);
+        goto done;
+    }
+
     len = strlen(kv_pairs);
     value = (char*)calloc(len, sizeof(char));
     if(value == NULL) {
@@ -631,7 +644,8 @@
     }
 
 done:
-    free(kv_pairs);
+    if (kv_pairs)
+        free(kv_pairs);
     if(value != NULL)
         free(value);
     return;