aml_commonlib: fix NULL ptr and str value [1/1]

PD#SWPL-8653

Problem:
Can't call IPC with NULL ptr and str value

Solution:
handle NULL value

Verify:
mesonaxg_s420_32_release

Change-Id: Ia1f1cda224347f586589488d82813ac121fe97f3
Signed-off-by: Daogao Xu <daogao.xu@amlogic.com>
diff --git a/socketipc/socketipc.h b/socketipc/socketipc.h
index 161559d..13096cc 100644
--- a/socketipc/socketipc.h
+++ b/socketipc/socketipc.h
@@ -1,3 +1,29 @@
+/*
+ * Copyright (C) 2014-2019 Amlogic, Inc. All rights reserved.
+ *
+ * All information contained herein is Amlogic confidential.
+ *
+ * This software is provided to you pursuant to Software License Agreement
+ * (SLA) with Amlogic Inc ("Amlogic"). This software may be used
+ * only in accordance with the terms of this agreement.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification is strictly prohibited without prior written permission from
+ * Amlogic.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -273,48 +299,29 @@
     return type->len;
 }
 
-static int32_t _ipc_pack_str(struct SIPC_DataType * type, void * buf, int len, va_list *va) {
-    (void)type;
-    char* ptr = va_arg(*va, char*);
-    int32_t tlen = snprintf(buf,len,"%s",ptr) + 1;
-    if (len < tlen)
-        tlen= SIPC_ERR_PARAM;
-    return tlen;
-}
-
-static int32_t _ipc_upack_str(struct SIPC_DataType * type, void * buf, int len, va_list *va) {
-    (void)type;
-    int32_t tlen = strnlen(buf,len)+1;
-    if (len < tlen)
-        return SIPC_ERR_PARAM;
-    char **pptr = va_arg(*va, char**);
-    *pptr = buf;
-    return tlen;
-}
-
 static int32_t _ipc_pack_pointer(struct SIPC_DataType * type, void * buf, int len, va_list *va) {
-    (void)type;
     void* ptr = va_arg(*va, void*);
-    int32_t tlen = va_arg(*va,int32_t);
+    int32_t tlen = type->type_id == SIPC_TYPE_ID(str) ? (ptr ? strlen(ptr) + 1 : 0) : va_arg(*va, int32_t);
     if ((tlen<0) || (len < tlen+4))
         return SIPC_ERR_PARAM;
     ((uint8_t*)buf)[0] = ((uint8_t*)&tlen)[3];
     ((uint8_t*)buf)[1] = ((uint8_t*)&tlen)[2];
     ((uint8_t*)buf)[2] = ((uint8_t*)&tlen)[1];
     ((uint8_t*)buf)[3] = ((uint8_t*)&tlen)[0];
-    memcpy((uint8_t*)buf+4,ptr,tlen);
+    if (tlen) memcpy((uint8_t *)buf + 4, ptr, tlen);
     return tlen+4;
 }
 
 static int32_t _ipc_upack_pointer(struct SIPC_DataType * type, void * buf, int len, va_list *va) {
-    (void)type;
     int32_t tlen = ((uint32_t)((uint8_t*)buf)[0] << 24) | ((uint32_t)((uint8_t*)buf)[1] << 16) | ((uint32_t)((uint8_t*)buf)[2] << 8) | ((uint32_t)((uint8_t*)buf)[3]);
     if ((tlen<0) && (len < tlen+4))
         return SIPC_ERR_PARAM;
     void ** ptr = va_arg(*va, void**);
-    int32_t * plen = va_arg(*va, int32_t*);
     *ptr = tlen ? buf + 4 : NULL;
-    *plen = tlen;
+    if (type->type_id == SIPC_TYPE_ID(ptr)) {
+        int32_t * plen = va_arg(*va, int32_t*);
+        *plen = tlen;
+    }
     return tlen+4;
 }
 
@@ -328,7 +335,7 @@
     {SIPC_TYPE_ID(u32),4,_ipc_pack_number,_ipc_upack_number,0},
     {SIPC_TYPE_ID(i64),8,_ipc_pack_number,_ipc_upack_number,0},
     {SIPC_TYPE_ID(u64),8,_ipc_pack_number,_ipc_upack_number,0},
-    {SIPC_TYPE_ID(str),4,_ipc_pack_str,_ipc_upack_str,0},
+    {SIPC_TYPE_ID(str),4,_ipc_pack_pointer,_ipc_upack_pointer,0},
     {SIPC_TYPE_ID(ptr),4,_ipc_pack_pointer,_ipc_upack_pointer,0},
 };