]> git.proxmox.com Git - libgit2.git/commitdiff
Fix test failure due to alignment-related crashes
authorPirate Praveen <praveen@debian.org>
Sat, 26 May 2018 12:00:24 +0000 (17:30 +0530)
committerPirate Praveen <praveen@debian.org>
Sat, 26 May 2018 12:00:24 +0000 (17:30 +0530)
debian/patches/index-Fix-alignment-issues-in-write_disk_entry.patch [new file with mode: 0644]
debian/patches/series

diff --git a/debian/patches/index-Fix-alignment-issues-in-write_disk_entry.patch b/debian/patches/index-Fix-alignment-issues-in-write_disk_entry.patch
new file mode 100644 (file)
index 0000000..95ff290
--- /dev/null
@@ -0,0 +1,86 @@
+From 2ce5a21f46e78cdc3f04cb783e372828494199d5 Mon Sep 17 00:00:00 2001
+From: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
+Date: Fri, 25 May 2018 01:41:33 +0200
+Subject: [PATCH] index: Fix alignment issues in write_disk_entry()
+
+In order to avoid alignment issues on certain target architectures,
+it is necessary to use memcpy() when modifying elements of a struct
+inside a buffer returned by git_filebuf_reserve().
+---
+ src/index.c | 42 +++++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+diff --git a/src/index.c b/src/index.c
+index a867547fbb..3dcb6dde77 100644
+--- a/src/index.c
++++ b/src/index.c
+@@ -2605,7 +2605,7 @@ static bool is_index_extended(git_index *index)
+ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const char *last)
+ {
+       void *mem = NULL;
+-      struct entry_short *ondisk;
++      struct entry_short ondisk;
+       size_t path_len, disk_size;
+       int varint_len = 0;
+       char *path;
+@@ -2633,9 +2633,7 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
+       if (git_filebuf_reserve(file, &mem, disk_size) < 0)
+               return -1;
+-      ondisk = (struct entry_short *)mem;
+-
+-      memset(ondisk, 0x0, disk_size);
++      memset(mem, 0x0, disk_size);
+       /**
+        * Yes, we have to truncate.
+@@ -2647,30 +2645,32 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
+        *
+        * In 2038 I will be either too dead or too rich to care about this
+        */
+-      ondisk->ctime.seconds = htonl((uint32_t)entry->ctime.seconds);
+-      ondisk->mtime.seconds = htonl((uint32_t)entry->mtime.seconds);
+-      ondisk->ctime.nanoseconds = htonl(entry->ctime.nanoseconds);
+-      ondisk->mtime.nanoseconds = htonl(entry->mtime.nanoseconds);
+-      ondisk->dev = htonl(entry->dev);
+-      ondisk->ino = htonl(entry->ino);
+-      ondisk->mode = htonl(entry->mode);
+-      ondisk->uid = htonl(entry->uid);
+-      ondisk->gid = htonl(entry->gid);
+-      ondisk->file_size = htonl((uint32_t)entry->file_size);
++      ondisk.ctime.seconds = htonl((uint32_t)entry->ctime.seconds);
++      ondisk.mtime.seconds = htonl((uint32_t)entry->mtime.seconds);
++      ondisk.ctime.nanoseconds = htonl(entry->ctime.nanoseconds);
++      ondisk.mtime.nanoseconds = htonl(entry->mtime.nanoseconds);
++      ondisk.dev = htonl(entry->dev);
++      ondisk.ino = htonl(entry->ino);
++      ondisk.mode = htonl(entry->mode);
++      ondisk.uid = htonl(entry->uid);
++      ondisk.gid = htonl(entry->gid);
++      ondisk.file_size = htonl((uint32_t)entry->file_size);
+-      git_oid_cpy(&ondisk->oid, &entry->id);
++      git_oid_cpy(&ondisk.oid, &entry->id);
+-      ondisk->flags = htons(entry->flags);
++      ondisk.flags = htons(entry->flags);
+       if (entry->flags & GIT_IDXENTRY_EXTENDED) {
+-              struct entry_long *ondisk_ext;
+-              ondisk_ext = (struct entry_long *)ondisk;
+-              ondisk_ext->flags_extended = htons(entry->flags_extended &
++              struct entry_long ondisk_ext;
++              memcpy(&ondisk_ext, &ondisk, sizeof(struct entry_short));
++              ondisk_ext.flags_extended = htons(entry->flags_extended &
+                       GIT_IDXENTRY_EXTENDED_FLAGS);
+-              path = ondisk_ext->path;
++              memcpy(mem, &ondisk_ext, sizeof(struct entry_long));
++              path = ((struct entry_long*)mem)->path;
+               disk_size -= offsetof(struct entry_long, path);
+       } else {
+-              path = ondisk->path;
++              memcpy(mem, &ondisk, sizeof(struct entry_short));
++              path = ((struct entry_short*)mem)->path;
+               disk_size -= offsetof(struct entry_short, path);
+       }
index 018c686f6b3f1cd543418330de55154a9878e125..c691bfa545f458d84a99f836cfb82ea6cbf5be07 100644 (file)
@@ -1,3 +1,4 @@
 use-mbedtls.patch
 disable-online-tests.patch
 remove-mbedtls-from-pkgconfig.patch
+index-Fix-alignment-issues-in-write_disk_entry.patch