On 01/03 2014 01:27, Dave Kleikamp wrote:
> On 01/01/2014 05:23 AM, Jeff Liu wrote:
> 
>> There is a potential overflow if the specified EA value size is
>> greater than USHRT_MAX because the size of value is limitted by
>> the on-disk format (i.e, __le16), this issue could be reflected
>> via the tests below:
>>  # touch /jfs/testfile
>>  # setfattr -n user.comment -v `perl -e 'print "A"x65536'` /jfs/testfile
>>    setfattr: /jfs/testfile: Invalid argument
>>
>> Syslog:
>>  ... jfs_xsetattr: xattr_size = 21, new_size = 65557
>>
>> This patch add pre-checkups of EA value size against USHRT_MAX to
>> avoid this problem, and return -E2BIG which is consistent with the
>> VFS setxattr interface.  Moreover, fix the debug code to print the
>> correct function name.
> 
> I see one problem with the patch. I'll fix it and give it a little
> testing before pushing it upstream.
> 
>> With this fix:
>>  setfattr: /jfs/testfile: Argument list too long
>>
>> Signed-off-by: Jie Liu <[email protected]>
>> ---
>>  fs/jfs/xattr.c | 13 ++++++++++++-
>>  1 file changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c
>> index d3472f4..21755fb 100644
>> --- a/fs/jfs/xattr.c
>> +++ b/fs/jfs/xattr.c
>> @@ -860,6 +860,17 @@ int __jfs_setxattr(tid_t tid, struct inode *inode, 
>> const char *name,
>>                      /* Completely new ea list */
>>                      xattr_size = sizeof (struct jfs_ea_list);
>>  
>> +            /*
>> +             * The size of EA value is limitted by on-disk format up to
>> +             *  __le16, there would be an overflow if the size is equal
>> +             * to XATTR_SIZE_MAX (65536).  In order to avoid this issue,
>> +             * we can pre-checkup the value size against USHRT_MAX, and
>> +             * return -E2BIG in this case, which is consistent with the
>> +             * VFS setxattr interface.
>> +             */
>> +            if (value_len >= USHRT_MAX)
>> +                    return -E2BIG;
> 
> Can't just return here after taking the xattr_sem and doing ea_get().
> Instead:
> 
>               if (value_len >= USHRT_MAX) {
>                       rc = -E2BIG;
>                       goto release;
>               }
Ah, indeed! that's my mistake. :)

Thanks,
-Jeff

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Jfs-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jfs-discussion

Reply via email to