VirtualBox

Changeset 2629 in kBuild for trunk/src


Ignore:
Timestamp:
Sep 6, 2012 3:16:25 PM (12 years ago)
Author:
bird
Message:

kash/parser.c: Fixed incorrect handling of \r\n -> \n conversion when there is a lone \r at the end of the input buffer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/input.c

    r2424 r2629  
    172172
    173173static int
    174 preadfd(shinstance *psh)
     174preadfd_inner(shinstance *psh, char *buf, int bufsize)
    175175{
    176176        int nr;
    177         char *buf = psh->parsefile->buf;
    178         psh->parsenextc = buf;
    179 
    180177retry:
    181178#ifndef SMALL
     
    190187                else {
    191188                        nr = el_len;
    192                         if (nr > BUFSIZ - 8)
    193                                 nr = BUFSIZ - 8;
     189                        if (nr > bufsize)
     190                                nr = bufsize;
    194191                        memcpy(buf, rl_cp, nr);
    195192                        if (nr != el_len) {
     
    202199        } else
    203200#endif
    204                 nr = shfile_read(&psh->fdtab, psh->parsefile->fd, buf, BUFSIZ - 8);
     201                nr = shfile_read(&psh->fdtab, psh->parsefile->fd, buf, bufsize);
    205202
    206203
     
    221218                }
    222219                nr = -1;
    223         } else {
     220        }
     221        return nr;
     222}
     223
     224
     225
     226static int
     227preadfd(shinstance *psh)
     228{
     229        int nr;
     230        char *buf = psh->parsefile->buf;
     231        psh->parsenextc = buf;
     232
    224233#ifdef SH_DEAL_WITH_CRLF
     234        /* Convert CRLF to LF. */
     235        nr = preadfd_inner(psh, buf, BUFSIZ - 9);
     236        if (nr > 0) {
    225237                char *cr = memchr(buf, '\r', nr);
    226238                while (cr) {
    227239                        size_t left = nr - (cr - buf);
     240
    228241                        if (left > 1 && cr[1] == '\n') {
    229242                                left--;
     
    231244                                memmove(cr, cr + 1, left);
    232245                                cr = memchr(cr, '\r', left);
     246                        } else if (left == 1) {
     247                                /* Special case: \r at buffer end.  Read one more char. Screw \r\r\n sequences. */
     248                                int nr2 = preadfd_inner(psh, cr + 1, 1);
     249                                if (nr2 != 1)
     250                                        break;
     251                                if (cr[1] == '\n') {
     252                                        *cr = '\n';
     253                                } else {
     254                                        nr++;
     255                                }
     256                                break;
    233257                        } else {
    234258                                cr = memchr(cr + 1, '\r', left);
    235259                        }
    236260                }
     261        }
     262#else
     263        nr = preadfd_inner(psh, buf, BUFSIZ - 8);
    237264#endif
    238         }
    239265        return nr;
    240266}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette