]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Don't overflow the Opaque_Handle buffer.
authorGuy Harris <[email protected]>
Sun, 25 Sep 2016 21:17:00 +0000 (14:17 -0700)
committerFrancois-Xavier Le Bail <[email protected]>
Wed, 18 Jan 2017 08:16:39 +0000 (09:16 +0100)
The file handle length can be arbitrarily large; don't assume its hex
dump will fit in the buffer, just truncate it if it doesn't.

nfsfh.h
parsenfsfh.c

diff --git a/nfsfh.h b/nfsfh.h
index cfd073bd054d3c0ce712b45f5189857b677da2df..5cf8fc4417a66e9cd0dab1f78dac5636cbb21bb2 100644 (file)
--- a/nfsfh.h
+++ b/nfsfh.h
@@ -63,4 +63,4 @@ typedef       struct {
 #define        fsid_eq(a,b)    ((a.fsid_code == b.fsid_code) &&\
                         dev_eq(a.Fsid_dev, b.Fsid_dev))
 
-extern void Parse_fh(const unsigned char *, int, my_fsid *, uint32_t *, const char **, const char **, int);
+extern void Parse_fh(const unsigned char *, u_int, my_fsid *, uint32_t *, const char **, const char **, int);
index d534ece07d2109d656c99c3bd107342caa7aefbf..43efd87693b098c36bfdca43e82d380ebacabdc7 100644 (file)
 static int is_UCX(const unsigned char *, u_int);
 
 void
-Parse_fh(register const unsigned char *fh, int len, my_fsid *fsidp,
+Parse_fh(register const unsigned char *fh, u_int len, my_fsid *fsidp,
         uint32_t *inop,
         const char **osnamep, /* if non-NULL, return OS name here */
         const char **fsnamep, /* if non-NULL, return server fs name here (for VMS) */
@@ -114,7 +114,7 @@ Parse_fh(register const unsigned char *fh, int len, my_fsid *fsidp,
        register const unsigned char *fhp = fh;
        uint32_t temp;
        int fhtype = FHT_UNKNOWN;
-       int i;
+       u_int i;
 
        /*
         * Require at least 16 bytes of file handle; it's variable-length
@@ -422,7 +422,7 @@ Parse_fh(register const unsigned char *fh, int len, my_fsid *fsidp,
            (void)fprintf(stderr, "\n");
 #endif
            /* Save the actual handle, so it can be display with -u */
-           for (i = 0; i < len*4; i++)
+           for (i = 0; i < len*4 && i*2 < sizeof(fsidp->Opaque_Handle) - 1; i++)
                (void)snprintf(&(fsidp->Opaque_Handle[i*2]), 3, "%.2X", fhp[i]);
 
            /* XXX for now, give "bogus" values to aid debugging */
@@ -452,7 +452,7 @@ Parse_fh(register const unsigned char *fh, int len, my_fsid *fsidp,
 static int
 is_UCX(const unsigned char *fhp, u_int len)
 {
-       register int i;
+       register u_int i;
        int seen_null = 0;
 
        /*