• A
    afs: Read of file returns EBADMSG · 2c724fb9
    Anton Blanchard 提交于
    A read of a large file on an afs mount failed:
    
    # cat junk.file > /dev/null
    cat: junk.file: Bad message
    
    Looking at the trace, call->offset wrapped since it is only an
    unsigned short. In afs_extract_data:
    
            _enter("{%u},{%zu},%d,,%zu", call->offset, len, last, count);
    ...
    
            if (call->offset < count) {
                    if (last) {
                            _leave(" = -EBADMSG [%d < %zu]", call->offset, count);
                            return -EBADMSG;
                    }
    
    Which matches the trace:
    
    [cat   ] ==> afs_extract_data({65132},{524},1,,65536)
    [cat   ] <== afs_extract_data() = -EBADMSG [0 < 65536]
    
    call->offset went from 65132 to 0. Fix this by making call->offset an
    unsigned int.
    Signed-off-by: NAnton Blanchard <anton@samba.org>
    Signed-off-by: NDavid Howells <dhowells@redhat.com>
    Cc: <stable@kernel.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    2c724fb9
internal.h 31.1 KB