summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-text/sdcv/files/sdcv-0.4.2-crash.patch')
-rw-r--r--app-text/sdcv/files/sdcv-0.4.2-crash.patch27
1 files changed, 27 insertions, 0 deletions
diff --git a/app-text/sdcv/files/sdcv-0.4.2-crash.patch b/app-text/sdcv/files/sdcv-0.4.2-crash.patch
new file mode 100644
index 000000000000..264cffcf1fca
--- /dev/null
+++ b/app-text/sdcv/files/sdcv-0.4.2-crash.patch
@@ -0,0 +1,27 @@
+Fix unalligned access to buffer.
+
+On several architectures (arm, armel, sparc and ia64), unalligned access to
+integers is not allowed. Buffer in this function is not alligned at all and
+attempt to read integer from it causes crash of application on such
+architectures.
+
+Reported upstream at:
+https://sourceforge.net/tracker/index.php?func=detail&aid=2149388&group_id=122858&atid=694730
+--- a/src/lib/lib.cpp
++++ b/src/lib/lib.cpp
+@@ -496,9 +496,13 @@
+ entries[i].keystr=p;
+ len=strlen(p);
+ p+=len+1;
+- entries[i].off=g_ntohl(*reinterpret_cast<guint32 *>(p));
++ /*
++ * Can not use typecasting here, because *data does not have
++ * to be alligned and unalligned access fails on some architectures.
++ */
++ entries[i].off=((unsigned char)p[0] << 24) | ((unsigned char)p[1] << 16) | ((unsigned char)p[2] << 8) | (unsigned char)p[3];
+ p+=sizeof(guint32);
+- entries[i].size=g_ntohl(*reinterpret_cast<guint32 *>(p));
++ entries[i].size=((unsigned char)p[0] << 24) | ((unsigned char)p[1] << 16) | ((unsigned char)p[2] << 8) | (unsigned char)p[3];
+ p+=sizeof(guint32);
+ }
+ }