Changeset dfe5a4e3 in rtems


Ignore:
Timestamp:
Oct 18, 2001, 6:48:55 PM (19 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
0c40eb3
Parents:
f20a20b
Message:

2001-10-18 Eric Norum <eric.norum@…>

  • lib/tftpDriver.c: Properly handles ../ components in chdir() and open() operations within the TFTP file system.
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libnetworking/ChangeLog

    rf20a20b rdfe5a4e3  
     12001-10-18      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/tftpDriver.c: Properly handles ../ components in chdir() and
     4        open() operations within the TFTP file system.
     5
    162001-10-12      Mike Siers <mikes@poliac.com>
    27
  • c/src/exec/libnetworking/lib/tftpDriver.c

    rf20a20b rdfe5a4e3  
    5252
    5353/*
     54 * Root node_access value
     55 * By using the address of a local static variable
     56 * we ensure a unique value for this identifier.
     57 */
     58#define ROOT_NODE_ACCESS    (&tftp_mutex)
     59
     60/*
    5461 * Default limits
    5562 */
     
    150157 * Number of streams open at the same time
    151158 */
    152 
    153159static rtems_id tftp_mutex;
    154160static int nStreams;
     
    195201
    196202  temp_mt_entry->fs_info                = NULL;
    197   temp_mt_entry->mt_fs_root.node_access = NULL;
     203  temp_mt_entry->mt_fs_root.node_access = ROOT_NODE_ACCESS;
    198204
    199205  /*
     
    425431)
    426432
     433  pathloc->node_access = NULL;
    427434  set_errno_and_return_minus_one( EIO );   
    428435}
    429436
     437/*
     438 * Convert a path to canonical form
     439 */
     440static void
     441fixPath (char *path)
     442{
     443    char *inp, *outp, *base;
     444
     445    outp = inp = path;
     446    base = NULL;
     447    for (;;) {
     448        if (inp[0] == '.') {
     449            if (inp[1] == '\0')
     450                break;
     451            if (inp[1] == '/') {
     452                inp += 2;
     453                continue;
     454            }
     455            if (inp[1] == '.') {
     456                if (inp[2] == '\0') {
     457                    if ((base != NULL) && (outp > base)) {
     458                        outp--;
     459                        while ((outp > base) && (outp[-1] != '/'))
     460                            outp--;
     461                    }
     462                    break;
     463                }
     464                if (inp[2] == '/') {
     465                    inp += 3;
     466                    if (base == NULL)
     467                        continue;
     468                    if (outp > base) {
     469                        outp--;
     470                        while ((outp > base) && (outp[-1] != '/'))
     471                            outp--;
     472                    }
     473                    continue;
     474                }
     475            }
     476        }
     477        if (base == NULL)
     478            base = inp;
     479        while (inp[0] != '/') {
     480            if ((*outp++ = *inp++) == '\0')
     481                return;
     482        }
     483        *outp++ = '/';
     484        while (inp[0] == '/')
     485            inp++;
     486    }
     487    *outp = '\0';
     488    return;
     489}
    430490
    431491static int rtems_tftp_eval_path( 
     
    442502     */
    443503    if (pathname[strlen(pathname)-1] == '/') {
     504        int isRelative = (pathloc->node_access != ROOT_NODE_ACCESS);
    444505        char *cp;
    445506       
     
    449510        if (flags)
    450511            set_errno_and_return_minus_one( EISDIR );
    451         cp = strdup (pathname);
    452         if (cp == NULL)
    453             set_errno_and_return_minus_one( ENOMEM );
     512        if (isRelative) {
     513            cp = malloc (strlen(pathloc->node_access)+strlen(pathname)+1);
     514            if (cp == NULL)
     515                set_errno_and_return_minus_one( ENOMEM );
     516            strcpy (cp, pathloc->node_access);
     517            strcat (cp, pathname);
     518        }
     519        else {
     520            cp = strdup (pathname);
     521            if (cp == NULL)
     522                set_errno_and_return_minus_one( ENOMEM );
     523        }
     524        fixPath (cp);
    454525        pathloc->node_access = cp;
    455526        return 0;
    456527    }
     528    if (pathloc->node_access != ROOT_NODE_ACCESS)
     529        pathloc->node_access = 0;
    457530
    458531    /*
     
    462535    if ((flags != RTEMS_LIBIO_PERMS_READ) && (flags != RTEMS_LIBIO_PERMS_WRITE) )
    463536        set_errno_and_return_minus_one( EINVAL );
    464     pathloc->node_access = NULL;
    465537    return 0;
    466538}
     
    708780    }
    709781    else {
    710         /*
    711          * Skip any leading ./ or ../ components.
    712          */
    713         for (;;) {
    714             while (*new_name == '/')
    715                 new_name++;
    716             if ((new_name[0] == '.') && (new_name[1] == '/')) {
    717                 new_name += 2;
    718                 continue;
    719             }
    720             if ((new_name[0] == '.') && (new_name[1] == '.') && (new_name[2] == '/')) {
    721                 new_name += 3;
    722                 continue;
    723             }
    724             break;
    725         }
    726782        s1 = rtems_filesystem_current.node_access;
    727783    }
     
    731787    strcpy (full_path_name, s1);
    732788    strcat (full_path_name, new_name);
     789    fixPath (full_path_name);
    733790    err = rtems_tftp_open_worker (iop, full_path_name, flags, mode);
    734791    free (full_path_name);
     
    9461003)
    9471004{
    948     if (pathloc->node_access) {
     1005    if (pathloc->node_access && (pathloc->node_access != ROOT_NODE_ACCESS)) {
    9491006        free (pathloc->node_access);
    9501007        pathloc->node_access = NULL;
  • c/src/libnetworking/ChangeLog

    rf20a20b rdfe5a4e3  
     12001-10-18      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/tftpDriver.c: Properly handles ../ components in chdir() and
     4        open() operations within the TFTP file system.
     5
    162001-10-12      Mike Siers <mikes@poliac.com>
    27
  • c/src/libnetworking/lib/tftpDriver.c

    rf20a20b rdfe5a4e3  
    5252
    5353/*
     54 * Root node_access value
     55 * By using the address of a local static variable
     56 * we ensure a unique value for this identifier.
     57 */
     58#define ROOT_NODE_ACCESS    (&tftp_mutex)
     59
     60/*
    5461 * Default limits
    5562 */
     
    150157 * Number of streams open at the same time
    151158 */
    152 
    153159static rtems_id tftp_mutex;
    154160static int nStreams;
     
    195201
    196202  temp_mt_entry->fs_info                = NULL;
    197   temp_mt_entry->mt_fs_root.node_access = NULL;
     203  temp_mt_entry->mt_fs_root.node_access = ROOT_NODE_ACCESS;
    198204
    199205  /*
     
    425431)
    426432
     433  pathloc->node_access = NULL;
    427434  set_errno_and_return_minus_one( EIO );   
    428435}
    429436
     437/*
     438 * Convert a path to canonical form
     439 */
     440static void
     441fixPath (char *path)
     442{
     443    char *inp, *outp, *base;
     444
     445    outp = inp = path;
     446    base = NULL;
     447    for (;;) {
     448        if (inp[0] == '.') {
     449            if (inp[1] == '\0')
     450                break;
     451            if (inp[1] == '/') {
     452                inp += 2;
     453                continue;
     454            }
     455            if (inp[1] == '.') {
     456                if (inp[2] == '\0') {
     457                    if ((base != NULL) && (outp > base)) {
     458                        outp--;
     459                        while ((outp > base) && (outp[-1] != '/'))
     460                            outp--;
     461                    }
     462                    break;
     463                }
     464                if (inp[2] == '/') {
     465                    inp += 3;
     466                    if (base == NULL)
     467                        continue;
     468                    if (outp > base) {
     469                        outp--;
     470                        while ((outp > base) && (outp[-1] != '/'))
     471                            outp--;
     472                    }
     473                    continue;
     474                }
     475            }
     476        }
     477        if (base == NULL)
     478            base = inp;
     479        while (inp[0] != '/') {
     480            if ((*outp++ = *inp++) == '\0')
     481                return;
     482        }
     483        *outp++ = '/';
     484        while (inp[0] == '/')
     485            inp++;
     486    }
     487    *outp = '\0';
     488    return;
     489}
    430490
    431491static int rtems_tftp_eval_path( 
     
    442502     */
    443503    if (pathname[strlen(pathname)-1] == '/') {
     504        int isRelative = (pathloc->node_access != ROOT_NODE_ACCESS);
    444505        char *cp;
    445506       
     
    449510        if (flags)
    450511            set_errno_and_return_minus_one( EISDIR );
    451         cp = strdup (pathname);
    452         if (cp == NULL)
    453             set_errno_and_return_minus_one( ENOMEM );
     512        if (isRelative) {
     513            cp = malloc (strlen(pathloc->node_access)+strlen(pathname)+1);
     514            if (cp == NULL)
     515                set_errno_and_return_minus_one( ENOMEM );
     516            strcpy (cp, pathloc->node_access);
     517            strcat (cp, pathname);
     518        }
     519        else {
     520            cp = strdup (pathname);
     521            if (cp == NULL)
     522                set_errno_and_return_minus_one( ENOMEM );
     523        }
     524        fixPath (cp);
    454525        pathloc->node_access = cp;
    455526        return 0;
    456527    }
     528    if (pathloc->node_access != ROOT_NODE_ACCESS)
     529        pathloc->node_access = 0;
    457530
    458531    /*
     
    462535    if ((flags != RTEMS_LIBIO_PERMS_READ) && (flags != RTEMS_LIBIO_PERMS_WRITE) )
    463536        set_errno_and_return_minus_one( EINVAL );
    464     pathloc->node_access = NULL;
    465537    return 0;
    466538}
     
    708780    }
    709781    else {
    710         /*
    711          * Skip any leading ./ or ../ components.
    712          */
    713         for (;;) {
    714             while (*new_name == '/')
    715                 new_name++;
    716             if ((new_name[0] == '.') && (new_name[1] == '/')) {
    717                 new_name += 2;
    718                 continue;
    719             }
    720             if ((new_name[0] == '.') && (new_name[1] == '.') && (new_name[2] == '/')) {
    721                 new_name += 3;
    722                 continue;
    723             }
    724             break;
    725         }
    726782        s1 = rtems_filesystem_current.node_access;
    727783    }
     
    731787    strcpy (full_path_name, s1);
    732788    strcat (full_path_name, new_name);
     789    fixPath (full_path_name);
    733790    err = rtems_tftp_open_worker (iop, full_path_name, flags, mode);
    734791    free (full_path_name);
     
    9461003)
    9471004{
    948     if (pathloc->node_access) {
     1005    if (pathloc->node_access && (pathloc->node_access != ROOT_NODE_ACCESS)) {
    9491006        free (pathloc->node_access);
    9501007        pathloc->node_access = NULL;
  • cpukit/libnetworking/ChangeLog

    rf20a20b rdfe5a4e3  
     12001-10-18      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/tftpDriver.c: Properly handles ../ components in chdir() and
     4        open() operations within the TFTP file system.
     5
    162001-10-12      Mike Siers <mikes@poliac.com>
    27
  • cpukit/libnetworking/lib/tftpDriver.c

    rf20a20b rdfe5a4e3  
    5252
    5353/*
     54 * Root node_access value
     55 * By using the address of a local static variable
     56 * we ensure a unique value for this identifier.
     57 */
     58#define ROOT_NODE_ACCESS    (&tftp_mutex)
     59
     60/*
    5461 * Default limits
    5562 */
     
    150157 * Number of streams open at the same time
    151158 */
    152 
    153159static rtems_id tftp_mutex;
    154160static int nStreams;
     
    195201
    196202  temp_mt_entry->fs_info                = NULL;
    197   temp_mt_entry->mt_fs_root.node_access = NULL;
     203  temp_mt_entry->mt_fs_root.node_access = ROOT_NODE_ACCESS;
    198204
    199205  /*
     
    425431)
    426432
     433  pathloc->node_access = NULL;
    427434  set_errno_and_return_minus_one( EIO );   
    428435}
    429436
     437/*
     438 * Convert a path to canonical form
     439 */
     440static void
     441fixPath (char *path)
     442{
     443    char *inp, *outp, *base;
     444
     445    outp = inp = path;
     446    base = NULL;
     447    for (;;) {
     448        if (inp[0] == '.') {
     449            if (inp[1] == '\0')
     450                break;
     451            if (inp[1] == '/') {
     452                inp += 2;
     453                continue;
     454            }
     455            if (inp[1] == '.') {
     456                if (inp[2] == '\0') {
     457                    if ((base != NULL) && (outp > base)) {
     458                        outp--;
     459                        while ((outp > base) && (outp[-1] != '/'))
     460                            outp--;
     461                    }
     462                    break;
     463                }
     464                if (inp[2] == '/') {
     465                    inp += 3;
     466                    if (base == NULL)
     467                        continue;
     468                    if (outp > base) {
     469                        outp--;
     470                        while ((outp > base) && (outp[-1] != '/'))
     471                            outp--;
     472                    }
     473                    continue;
     474                }
     475            }
     476        }
     477        if (base == NULL)
     478            base = inp;
     479        while (inp[0] != '/') {
     480            if ((*outp++ = *inp++) == '\0')
     481                return;
     482        }
     483        *outp++ = '/';
     484        while (inp[0] == '/')
     485            inp++;
     486    }
     487    *outp = '\0';
     488    return;
     489}
    430490
    431491static int rtems_tftp_eval_path( 
     
    442502     */
    443503    if (pathname[strlen(pathname)-1] == '/') {
     504        int isRelative = (pathloc->node_access != ROOT_NODE_ACCESS);
    444505        char *cp;
    445506       
     
    449510        if (flags)
    450511            set_errno_and_return_minus_one( EISDIR );
    451         cp = strdup (pathname);
    452         if (cp == NULL)
    453             set_errno_and_return_minus_one( ENOMEM );
     512        if (isRelative) {
     513            cp = malloc (strlen(pathloc->node_access)+strlen(pathname)+1);
     514            if (cp == NULL)
     515                set_errno_and_return_minus_one( ENOMEM );
     516            strcpy (cp, pathloc->node_access);
     517            strcat (cp, pathname);
     518        }
     519        else {
     520            cp = strdup (pathname);
     521            if (cp == NULL)
     522                set_errno_and_return_minus_one( ENOMEM );
     523        }
     524        fixPath (cp);
    454525        pathloc->node_access = cp;
    455526        return 0;
    456527    }
     528    if (pathloc->node_access != ROOT_NODE_ACCESS)
     529        pathloc->node_access = 0;
    457530
    458531    /*
     
    462535    if ((flags != RTEMS_LIBIO_PERMS_READ) && (flags != RTEMS_LIBIO_PERMS_WRITE) )
    463536        set_errno_and_return_minus_one( EINVAL );
    464     pathloc->node_access = NULL;
    465537    return 0;
    466538}
     
    708780    }
    709781    else {
    710         /*
    711          * Skip any leading ./ or ../ components.
    712          */
    713         for (;;) {
    714             while (*new_name == '/')
    715                 new_name++;
    716             if ((new_name[0] == '.') && (new_name[1] == '/')) {
    717                 new_name += 2;
    718                 continue;
    719             }
    720             if ((new_name[0] == '.') && (new_name[1] == '.') && (new_name[2] == '/')) {
    721                 new_name += 3;
    722                 continue;
    723             }
    724             break;
    725         }
    726782        s1 = rtems_filesystem_current.node_access;
    727783    }
     
    731787    strcpy (full_path_name, s1);
    732788    strcat (full_path_name, new_name);
     789    fixPath (full_path_name);
    733790    err = rtems_tftp_open_worker (iop, full_path_name, flags, mode);
    734791    free (full_path_name);
     
    9461003)
    9471004{
    948     if (pathloc->node_access) {
     1005    if (pathloc->node_access && (pathloc->node_access != ROOT_NODE_ACCESS)) {
    9491006        free (pathloc->node_access);
    9501007        pathloc->node_access = NULL;
Note: See TracChangeset for help on using the changeset viewer.