Advertisement
Guest User

Untitled

a guest
Aug 28th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. void *vlad_malloc(u_int32_t n)
  2. {
  3.  
  4. /* For some reason there is a bug in this function where if you allocate to a
  5. different pointer the same size as a previous allocation,
  6. it will overwrite the original pointer.
  7. Changed code so program aborts if a header is overwritten.
  8. Why is this happening and how can I fix it?
  9.  
  10. Also have a bug where in some cases max allocation I can make is to
  11. the Node space directly after my allocated spaces.
  12. Free
  13. 1. 256 bytes
  14. 2. 512 bytes
  15. 3. 2048 bytes
  16. Can only allocate max 256 bytes.
  17. Why is this and how can I fix this?
  18. */
  19.  
  20. int areaSize = HEADER_SIZE + n;
  21. int loop = 0;
  22.  
  23. /* Negative n and Zero n case */
  24. if (n == 0) {
  25. return NULL;
  26. }
  27.  
  28. if ((int)n < 0) {
  29. return NULL;
  30. }
  31.  
  32. free_header_t * currHeader = iToP(free_list_ptr);
  33.  
  34. //to traverse free list until find something it can fit in to.
  35. while (areaSize >= currHeader->size) {
  36. currHeader = iToP(currHeader->next);
  37. printf ("HELLO %p\n", currHeader);
  38. loop += 1;
  39. printf ("loop is now %d\n", loop);
  40.  
  41. if (currHeader->next == free_list_ptr) {
  42. return NULL;
  43. }
  44. }
  45.  
  46.  
  47.  
  48. //splitting
  49.  
  50. if (currHeader->size >= areaSize) {
  51. while ((currHeader->size)/2 >= areaSize) {
  52. currHeader->size = (currHeader->size)/2;
  53.  
  54. free_header_t *newHeader = iToP(currHeader->size);
  55. free_header_t *nextHeader = iToP(currHeader->next);
  56.  
  57. newHeader->magic = MAGIC_FREE;
  58. newHeader->size = currHeader->size;
  59. newHeader->next = currHeader->next;
  60. newHeader->prev = nextHeader->prev;
  61.  
  62. printf ("newHeader->next is at %d\n", newHeader->next);
  63. printf ("nextHeader->prev is at %d\n", nextHeader->prev);
  64. printf ("currHeader is at %d\n", newHeader->prev);
  65.  
  66. assert (currHeader->magic == MAGIC_FREE);
  67.  
  68. currHeader->next = newHeader->prev + currHeader->size; //curr->next = new;
  69. nextHeader->prev = currHeader->next; //nextHeader->prev = new;
  70.  
  71. }
  72.  
  73. if (currHeader->magic == MAGIC_ALLOC) {
  74. fprintf(stderr, "Memory corruption\n");
  75. abort();
  76. } else {
  77. currHeader->magic = MAGIC_ALLOC;
  78. free_header_t *next = iToP(currHeader->next);
  79. free_header_t *prev = iToP(currHeader->prev);
  80.  
  81. next->prev = currHeader->prev;
  82. prev->next = currHeader->next;
  83.  
  84. }
  85.  
  86. //increment freelistptr here. Should only do it if the thing you just
  87. //allocated was the freelistptr
  88. if(loop != 1){
  89. free_list_ptr = currHeader->next;
  90. }
  91.  
  92. printf ("free_list_ptr is at %d\n", free_list_ptr);
  93.  
  94. }
  95.  
  96. if ((currHeader->next == currHeader->prev) &&
  97. (currHeader->next == (byte*)currHeader - (byte*)memory)) {
  98. return NULL;
  99. } else {
  100. return ((void *)currHeader + HEADER_SIZE);
  101. }
  102.  
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement