Fixing crash in ocrandom.c (#516)
[platform/upstream/iotivity.git] / resource / c_common / ocrandom / src / ocrandom.c
index babf32b..c7c7e09 100644 (file)
@@ -187,48 +187,28 @@ int8_t OCSeedRandom()
 
 void OCFillRandomMem(uint8_t * location, uint16_t len)
 {
-    int i, j, rand_idx;
-    i = len;
     if (!location)
     {
         return;
     }
+    uint16_t i, rand_idx;
+    uint8_t *loc;
+    i = len;
+    loc = location;
     for (; i--;)
     {
-        *location++ = OCGetRandomByte();
-    }
-    uint8_t *temp = (char *) OICCalloc(len, sizeof(char));
-    int *mask = (int *) OICCalloc(len, sizeof(int));
-    for (i = 0; i < len; i++)
-    {
-        mask[i] = 0;
+        *loc++ = OCGetRandomByte();
     }
-    j = 0;
-    for (i = 0; i < len; i++)
-    {
-        rand_idx = lrand48() % len;
-        while((rand_idx < len) && (mask[rand_idx] != 0))
-        {
-            rand_idx++;
-        }
-        if(rand_idx == len)
-        {
-            rand_idx = 0;
-            while(mask[rand_idx] != 0)
-            {
-                rand_idx++;
-            }
-        }
-        temp[rand_idx] = location[j];
-        mask[rand_idx] = 1;
-        j++;
-    }
-    for (i = 0; i < len; i++)
+    uint8_t temp;
+    i = len;
+    while(i > 1)
     {
-        location[i] = temp[i];
+        rand_idx = lrand48() % i;
+        temp = location[i - 1];
+        location[i - 1] = location[rand_idx];
+        location[rand_idx] = temp;
+        i--;
     }
-    OICFree(temp);
-    OICFree(mask);
 }
 
 uint32_t OCGetRandom()