Re: [UPDATED PATCH] fix memory corruption from misinterpreted bad_inode_ops return values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


On Thu, 4 Jan 2007, Mitchell Blank Jr wrote:
> I don't think you need to do fancy #ifdef's:
> static s32 return_eio_32(void) { return -EIO; }
> static s64 return_eio_64(void) { return -EIO; }
> extern void return_eio_unknown(void);   /* Doesn't exist */
> #define return_eio(type)        ((sizeof(type) == 4)			\
> 					? ((void *) return_eio_32)	\
> 				: ((sizeof(type) == 8)			\
> 					? ((void *) return_eio_64)	\
> 					: ((void *) return_eio_unknown)))

Well, that probably would work, but it's also true that returning a 64-bit 
value on a 32-bit platform really _does_ depend on more than the size.

For an example of this, try compiling this:

	long long a(void)
		return -1;

	struct dummy { int a, b };

	struct dummy b(void)
		struct dummy retval = { -1 , -1 };
		return retval;

on x86.

Now, I don't think we actually have anything like this in the kernel, and 
your example is likely to work very well in practice, but once we start 
doing tricks like this, I actually think it's getting easier to just say 
"let's not play tricks with function types at all".

Anybody want to send in the patch that just generates separate versions 

	loff_t eio_llseek(struct file *file, loff_t offset, int origin)
		return -EIO;

	int eio_readdir(struct file *filp, void *dirent, filldir_t filldir)
		return -EIO;

and so on?

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at
Please read the FAQ at

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux