Ticket #2384: nfs-4GiB.patch

File nfs-4GiB.patch, 2.6 KB (added by Nick Withers, on Aug 5, 2015 at 3:41:03 AM)

Slight change to patch - we've already converted iop->offset to a uint32_t

  • cpukit/libfs/src/nfsclient/src/nfs.c

    From b5f6e3e4d007ded7b09f5b10fc94908a94c6c5dc Mon Sep 17 00:00:00 2001
    From: Nick Withers <nick.withers@anu.edu.au>
    Date: Tue, 4 Aug 2015 11:28:19 +1000
    Subject: [PATCH] [NFS client] Respect 2^32 - 1 B NFSv2 maximum file size
    
    ---
     cpukit/libfs/src/nfsclient/src/nfs.c | 48 +++++++++++++++++++++++++++++++++---
     1 file changed, 45 insertions(+), 3 deletions(-)
    
    diff --git a/cpukit/libfs/src/nfsclient/src/nfs.c b/cpukit/libfs/src/nfsclient/src/nfs.c
    index 270a9fa..169d7d6 100644
    a b  
    6969#include <rtems/seterr.h>
    7070#include <string.h>
    7171#include <stdio.h>
     72#include <stdint.h>
    7273#include <stdlib.h>
    7374#include <assert.h>
    7475#include <sys/stat.h>
    static ssize_t nfs_file_read( 
    24512452        uint32_t offset = iop->offset;
    24522453        char *in = buffer;
    24532454
     2455        if (iop->offset < 0) {
     2456                errno = EINVAL;
     2457                return -1;
     2458        }
     2459
     2460        if ((uintmax_t) iop->offset >= UINT32_MAX) {
     2461                errno = EFBIG;
     2462                return -1;
     2463        }
     2464
     2465        if (count > UINT32_MAX - offset) {
     2466                count = UINT32_MAX - offset;
     2467        }
     2468
    24542469        do {
    24552470                size_t chunk = count <= NFS_MAXDATA ? count : NFS_MAXDATA;
    24562471                ssize_t done = nfs_file_read_chunk(node, offset, in, chunk);
    Nfs nfs = node->nfs; 
    25502565                count = NFS_MAXDATA;
    25512566
    25522567
    2553         SERP_ARGS(node).writearg.beginoffset   = UINT32_C(0xdeadbeef);
     2568        SERP_ARGS(node).writearg.beginoffset = UINT32_C(0xdeadbeef);
    25542569        if ( LIBIO_FLAGS_APPEND & iop->flags ) {
    25552570                if ( updateAttr(node, 0) ) {
    25562571                        return -1;
    25572572                }
    2558                 SERP_ARGS(node).writearg.offset            = SERP_ATTR(node).size;
     2573                if (SERP_ATTR(node).size >= UINT32_MAX) {
     2574                        errno = EFBIG;
     2575                        return -1;
     2576                }
     2577                SERP_ARGS(node).writearg.offset = SERP_ATTR(node).size;
    25592578        } else {
    2560                 SERP_ARGS(node).writearg.offset            = iop->offset;
     2579                if (iop->offset < 0) {
     2580                        errno = EINVAL;
     2581                        return -1;
     2582                }
     2583                if ((uintmax_t) iop->offset >= UINT32_MAX) {
     2584                        errno = EFBIG;
     2585                        return -1;
     2586                }
     2587                SERP_ARGS(node).writearg.offset = iop->offset;
    25612588        }
     2589
     2590        if (count > UINT32_MAX - SERP_ARGS(node).writearg.offset) {
     2591                count = UINT32_MAX - SERP_ARGS(node).writearg.offset;
     2592        }
     2593
    25622594        SERP_ARGS(node).writearg.totalcount        = UINT32_C(0xdeadbeef);
    25632595        SERP_ARGS(node).writearg.data.data_len = count;
    25642596        SERP_ARGS(node).writearg.data.data_val = (void*)buffer;
    static int nfs_file_ftruncate( 
    28172849{
    28182850sattr                                   arg;
    28192851
     2852        if (length < 0) {
     2853                errno = EINVAL;
     2854                return -1;
     2855        }
     2856
     2857        if ((uintmax_t) length > UINT32_MAX) {
     2858                errno = EFBIG;
     2859                return -1;
     2860        }
     2861
    28202862        arg.size = length;
    28212863        /* must not modify any other attribute; if we are not the owner
    28222864         * of the file or directory but only have write access changing