|
@@ -1363,9 +1363,17 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg,
|
|
|
|
|
|
if (addr) {
|
|
|
if (addr & (shmlba - 1)) {
|
|
|
- if (shmflg & SHM_RND)
|
|
|
+ if (shmflg & SHM_RND) {
|
|
|
addr &= ~(shmlba - 1); /* round down */
|
|
|
- else
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ensure that the round-down is non-nil
|
|
|
+ * when remapping. This can happen for
|
|
|
+ * cases when addr < shmlba.
|
|
|
+ */
|
|
|
+ if (!addr && (shmflg & SHM_REMAP))
|
|
|
+ goto out;
|
|
|
+ } else
|
|
|
#ifndef __ARCH_FORCE_SHMLBA
|
|
|
if (addr & ~PAGE_MASK)
|
|
|
#endif
|