1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c
index 27784ae..d5b8c73 100644
--- a/firmware/common/dircache.c
+++ b/firmware/common/dircache.c
@@ -567,7 +567,10 @@ int dircache_load(void)
         return -3;
     }
     
-    dircache_root = buffer_alloc(maindata.size + DIRCACHE_RESERVE);
+    allocated_size = maindata.size + DIRCACHE_RESERVE;
+    dircache_root = buffer_alloc(allocated_size);
+    /* needs to be struct-size aligned so that the pointer arithmetic below works */
+    ALIGN_BUFFER(dircache_root, allocated_size, sizeof(struct dircache_entry));
     entry_count = maindata.entry_count;
     appflags = maindata.appflags;
 
@@ -621,13 +624,12 @@ int dircache_load(void)
             if (dircache_root[i].up)
                 dircache_root[i].up -= offset_entries;
             if (dircache_root[i].down)
-                dircache_root[i].down -= offset_entries;
+                dircache_root[i].down -= offset_entries;                
         }
     }
 
     /* Cache successfully loaded. */
     dircache_size = maindata.size;
-    allocated_size = dircache_size + DIRCACHE_RESERVE;
     reserve_used = 0;
     logf("Done, %ld KiB used", dircache_size / 1024);
     dircache_initialized = true;