diff options
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.patch | 27 |
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); + } + } |