summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-06-29 13:57:13 -0400
committerRich Felker <dalias@aerifal.cx>2013-06-29 13:57:13 -0400
commit9b732fe51b814468a08c84d13238b4c83a42451a (patch)
treeba7d4fed8688a352ffb8904b2493839dd7ca0578
parent780cbbe63ad9e60ef30dbcb2d74271e899dae245 (diff)
downloadmusl-9b732fe51b814468a08c84d13238b4c83a42451a.tar.gz
fix shifts possibly larger than type in major() macro
in theory this should not be an issue, since major() should only be applied to type dev_t, which is 64-bit. however, it appears some applications are not using dev_t but a smaller integer type (which works on Linux because the kernel's dev_t is really only 32-bit). to avoid the undefined behavior, do it as two shifts.
-rw-r--r--include/sys/sysmacros.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h
index d6c6aef6..07a3ef18 100644
--- a/include/sys/sysmacros.h
+++ b/include/sys/sysmacros.h
@@ -2,7 +2,7 @@
#define _SYS_SYSMACROS_H
#define major(x) \
- ((unsigned)( (((x)>>32) & 0xfffff000) | (((x)>>8) & 0x00000fff) ))
+ ((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) ))
#define minor(x) \
((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) ))