Fix bundle_decode 88/37088/4
authorSangyoon Jang <s89.jang@samsung.com>
Thu, 19 Mar 2015 04:39:30 +0000 (13:39 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Fri, 20 Mar 2015 01:24:59 +0000 (10:24 +0900)
g_base64_decode() decodes null-terminated string, but the result of
bundle_encode() is raw data(not null-terminated).
for decode raw data, it should use g_base64_decode_step().

Change-Id: Ia3d9cda70002cc0b2b53b8e315e0d109893e5d32
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/bundle.c

index 6f8618d5bd04d127373345bff2c1b90577723c49..81ac13bb6b06feca243f5b8787fd4e9b693f72f8 100644 (file)
@@ -517,6 +517,8 @@ bundle_decode(const bundle_raw *r, const int data_size)
        bundle *b;
        bundle_raw *p_r;
        unsigned char *d_str;
+       gint state = 0;
+       guint save = 0;
        unsigned int d_len_raw;
        unsigned char *d_r;
        unsigned int d_len;
@@ -534,8 +536,25 @@ bundle_decode(const bundle_raw *r, const int data_size)
                return NULL;
        }
 
-       /* base 64 decode of input string*/
-       d_str = g_base64_decode((char *)r, &d_len_raw);
+       /* base 64 decode of input string
+        * Since base64 encodes 3 bytes in 4 chars (+3 may be needed in case of non-zero state)
+        * refer to: https://developer.gnome.org/glib/stable/glib-Base64-Encoding.html#g-base64-decode-step
+        */
+       d_str = malloc((data_size / 4) * 3 + 3);
+       if (unlikely(NULL == d_str)) {
+               set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
+               free(extract_cksum);
+               return NULL;
+       }
+
+       d_len_raw = g_base64_decode_step((char *)r, data_size, d_str, &state, &save);
+       if (d_len_raw < CHECKSUM_LENGTH) {
+               set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
+               free(d_str);
+               free(extract_cksum);
+               return NULL;
+       }
+
        /*extract checksum from the received string */
        strncpy(extract_cksum, (const char *)d_str, CHECKSUM_LENGTH);
        /* compute checksum for the data */